无法使用评估器推断实例
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
类型的参数,可以是 Val
或 Div
。 eval 4
表示您将 Int
传递给函数。为此,eval
必须定义为:
eval :: Int -> Int
通过编写 (Val 4)
,您将调用 Expr
类型的数据构造函数之一,创建类型 Expr
的新值,您可以将其传递给 eval
并让编译器开心。
我已经开始学习 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
类型的参数,可以是 Val
或 Div
。 eval 4
表示您将 Int
传递给函数。为此,eval
必须定义为:
eval :: Int -> Int
通过编写 (Val 4)
,您将调用 Expr
类型的数据构造函数之一,创建类型 Expr
的新值,您可以将其传递给 eval
并让编译器开心。