haskell - 定义实例时种类不匹配

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

最佳答案

根据您的类定义,您需要定义一个 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/

相关文章:

types - OCaml 在不相交的联合中有记录语法吗?

algorithm - Haskell 中的 Maze Solver - 确定迷宫是否无法解决

function - 为什么这些褶皱停在头/尾?

python - 使用 SWIG 生成 Python 类型提示

haskell - 如何在 Haskell 中编写错误类型?

typescript - 如何在模块声明中重新导出命名空间定义

python - 每 50 个打印一系列数字

clojure - 为什么 Clojure 的 core.reducers 比惰性集合函数更快

Haskell 合格导入(创建空集)

haskell - 为什么 MVar 不适用于 `par` ?