定义实例时出现错误匹配

时间:2012-07-07 20:53:14

标签: haskell types functional-programming ghc

我在阅读各种Haskell教程时写的第一个程序给了我一个"种类不匹配"错误

import qualified Data.Vector as V

class SupervisedLearner l where
    learn :: l (Input n) -> Output n

data Input n = Supervised (V.Vector n ,V.Vector n) | Unsupervised (V.Vector n)
data Output n =  Regression n | KClass (V.Vector n) | Bernoulli (n, n)
newtype Perceptron  = Perceptron (V.Vector Float)

instance SupervisedLearner Perceptron  where
    learn = undefined

当我尝试遵循错误的类型签名时,让我感到困惑的是

Kind mis-match
The first argument of `SupervisedLearner' should have kind `*
                                                            -> *',
but `Perceptron' has kind `*'
In the instance declaration for `SupervisedLearner Perceptron'

我似乎无法理解我应该在哪里开始纠正它。 所以我的问题是双重的,错误在哪里,而且一般来说,我是否正确使用Haskell类型类系统?

1 个答案:

答案 0 :(得分:2)

根据您的班级定义,您需要定义learn类型的方法l (Input n) -> Output n,以使l成为SupervisedLearner的实例。因此,要使Perceptron成为SupervisedLearner的实例,learn必须具有Perceptron (Input n) -> Output n类型。

但是Perceptron类型不接受任何类型参数,因此Perceptron (Input n)不是有效类型。这就是错误消息抱怨的内容(kind *表示类型不接受任何类型参数,而* -> *表示类型采用一种类型参数)。