我已经开始通过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。
答案 0 :(得分:3)
eval
期望的是eval
定义的类型的参数。查看签名时,它需要Expr
类型的参数,Val
或Div
。 eval 4
表示您将Int
传递给该函数。为了实现这一目标,eval
必须定义为:
eval :: Int -> Int
通过编写(Val 4)
,您正在调用Expr
类型的一个数据构造函数,创建一个Expr
类型的新值,您可以将其传递给eval
和让编译器开心。