我在阅读各种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类型类系统?
答案 0 :(得分:2)
根据您的班级定义,您需要定义learn
类型的方法l (Input n) -> Output n
,以使l
成为SupervisedLearner
的实例。因此,要使Perceptron成为SupervisedLearner
的实例,learn
必须具有Perceptron (Input n) -> Output n
类型。
但是Perceptron
类型不接受任何类型参数,因此Perceptron (Input n)
不是有效类型。这就是错误消息抱怨的内容(kind *
表示类型不接受任何类型参数,而* -> *
表示类型采用一种类型参数)。