限制数据构造函数中的monad类型

时间:2014-12-02 00:18:41

标签: haskell monads

我希望在Haskell创建一个小型的monadic解释器,我遇到了一个问题,GHC向我抱怨那些种类不匹配。

具体来说,这是数据类型值的声明:

data Value = Wrong
           | Num Int
           | Fun (Value -> Monad Value)

当我编译它时,GHC给出以下错误消息:

The first argument of ‘Monad’ should have kind ‘* -> *’,
  but ‘Value’ has kind ‘*’
In the type ‘Value -> (Monad Value)’
In the definition of data constructor ‘Fun’
In the data declaration for ‘Value’

Monad Value属于*。所以我不一定在这里看到问题吗?

有人可以向我指出我没见过的错误吗?非常感谢!

P.S。这个翻译是基于Wadler的论文函数式编程的本质中介绍的。

1 个答案:

答案 0 :(得分:0)

基本上,Monad需要一个带有一个参数的类型构造函数。 Value是一个不带参数的类型构造函数。因此,Value必须有一种* -> *(意味着它需要一个参数)而不是*(意味着它不需要参数)。

此外,如果Value确实接受了一个参数(允许此类型检查),则Monad Value属于Constraint。这是因为Monad属于(* -> *) -> Constraint种类,而Monad Value则将其应用于某种类型* -> *