0

我已经开始通过http://www.cs.nott.ac.uk/~pszgmh/monads学习函数式编程课程的介绍。有什么比实际尝试和测试代码更好的方式来尝试和理解事物。

唉,在第二页上我遇到以下内容:

data Expr = Val Int | Div Expr Expr

eval            :: Expr -> Int 
eval (Val n)    = n 
eval (Div x y)  = eval x `div` eval y

当我尝试运行它时会产生错误。我不太确定为什么会这样。当我尝试

eval (Val 4) `div` eval (Val 2) 

在 repl 循环中,它工作得很好,但是

eval 4 `div` eval 2 

以类型推断错误结束。

当我将定义更新为以下内容时:

data Expr = Val Int | Div Expr Expr

eval            :: Expr -> Int 
eval (Val n)    = n 
eval (Div x y)  = eval (Val x) `div` eval (Val y)

我在定义中遇到类型错误。第一个定义有什么问题?顺便说一句,该课程使用Hugs。

4

1 回答 1

3

eval期望的是为其定义的类型的参数eval。查看签名,它需要一个类型Expr为 aVal或 a的参数Diveval 4表示您正在将 an 传递Int给函数。为此,eval必须将其定义为:

eval :: Int -> Int

通过编写(Val 4),您正在调用 type 的数据构造函数之一Expr,创建一个新的 type 值Expr,您可以将其传递给eval编译器并使编译器满意。

于 2015-12-06T11:54:06.163 回答