Haskell:使用lambda抽象时GHCI错误

时间:2014-02-16 21:45:11

标签: haskell lambda ghci

我尝试运行以下代码,该代码取自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)]

哪个有效,我想开始运行原始样本,并且想知道我错过了什么。

1 个答案:

答案 0 :(得分:4)

我没有这本书,但这显然是一个错字。应该是:

type Parser a = String -> [(a, String)]

顺便说一句,作者的网站上有本书的所有代码,如果你看一下Parsing.lhs,你会看到定义

newtype Parser a  =  P (String -> [(a,String)])

这可能是一个更高级的版本,在本章中逐步获得,但无论如何,解析器具有输入字符串这一事实至关重要。