无法使用评估程序

时间:2015-12-06 11:37:56

标签: haskell type-inference hugs

我已经开始通过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-loop中,它工作得很好,但是

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。

1 个答案:

答案 0 :(得分:3)

eval期望的是eval定义的类型的参数。查看签名时,它需要Expr类型的参数,ValDiveval 4表示您将Int传递给该函数。为了实现这一目标,eval必须定义为:

eval :: Int -> Int

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