我希望在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的论文函数式编程的本质中介绍的。
答案 0 :(得分:0)
基本上,Monad
需要一个带有一个参数的类型构造函数。 Value
是一个不带参数的类型构造函数。因此,Value
必须有一种* -> *
(意味着它需要一个参数)而不是*
(意味着它不需要参数)。
此外,如果Value
确实接受了一个参数(允许此类型检查),则Monad Value
属于Constraint
。这是因为Monad
属于(* -> *) -> Constraint
种类,而Monad Value
则将其应用于某种类型* -> *
。