我在阅读各种 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 类型类系统?
最佳答案
根据您的类定义,您需要定义一个 l (Input n) -> Output n
类型的方法 learn
来生成 l
SupervisedLearner 的实例。因此,要使 Perceptron 成为 SupervisedLearner 的实例,learn
必须具有类型 Perceptron (Input n) -> Output n
。
但是 Perceptron
类型不接受任何类型参数,因此 Perceptron (Input n)
不是有效类型。这就是错误消息所提示的内容(kind *
意味着类型不接受任何类型参数,kind * -> *
意味着类型接受一个类型参数)。
关于haskell - 定义实例时种类不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11378535/