我尝试运行以下代码,该代码取自Graham Hutton的“Haskell编程”
type Parser a = [(a, String)]
return :: a -> Parser a
return v = \inp -> [(v,inp)]
在GHCI 7.6.3中加载模块时,会发生以下错误:
Couldn't match expected type `t0 -> [(a, t0)]'
with actual type `[(a, String)]'
The lambda expression `\ inp -> ...' has one argument,
but its type `Parser a' has none
In the expression: \ inp -> [(v, inp)]
In an equation for `return': return v = \ inp -> [(v, inp)]
Failed, modules loaded: none.
我将示例更改为:
type Parser a = [(a, String)]
return :: a -> String -> Parser a
return v inp = [(v,inp)]
哪个有效,我想开始运行原始样本,并且想知道我错过了什么。
答案 0 :(得分:4)
我没有这本书,但这显然是一个错字。应该是:
type Parser a = String -> [(a, String)]
顺便说一句,作者的网站上有本书的所有代码,如果你看一下Parsing.lhs
,你会看到定义
newtype Parser a = P (String -> [(a,String)])
这可能是一个更高级的版本,在本章中逐步获得,但无论如何,解析器具有输入字符串这一事实至关重要。