无法使用评估器推断实例

Cannot infer instance using evaluator

我已经开始学习 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

eval 期望的是 eval 为其定义的类型的参数。查看签名,它需要一个 Expr 类型的参数,可以是 ValDiveval 4 表示您将 Int 传递给函数。为此,eval 必须定义为:

eval :: Int -> Int

通过编写 (Val 4),您将调用 Expr 类型的数据构造函数之一,创建类型 Expr 的新值,您可以将其传递给 eval 并让编译器开心。