2

我在阅读各种 Haskell 教程时编写的第一个程序给了我一个“Kind mis-match”错误

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 类型类系统?

4

1 回答 1

2

根据您的类定义,您需要定义一个learn类型的方法l (Input n) -> Output nl创建SupervisedLearner. 因此,要使 Perceptron 成为 的实例SupervisedLearnerlearn必须具有类型Perceptron (Input n) -> Output n

但是该Perceptron类型不接受任何类型参数,因此Perceptron (Input n)不是有效类型。这就是错误消息所抱怨的(kind*意味着一个类型不接受任何类型参数,而 kind* -> *意味着一个类型接受一个类型参数)。

于 2012-07-07T21:42:38.357 回答