【问题标题】:kind mis-match when defining an instance定义实例时种类不匹配
【发布时间】:2012-07-07 21:02:16
【问题描述】:

我在阅读各种 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 类型类系统?

【问题讨论】:

  • 你能验证错误信息吗?当我尝试编译它时,我得到一个不同类型的错误。它说 SupervisedLearner 应该有一种* -> *
  • 已将错误消息修复为它真正向我显示的内容,但问题仍然存在。

标签: haskell types functional-programming ghc


【解决方案1】:

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

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

【讨论】:

  • 谢谢,读了几遍,但这是有道理的。我认为发生的事情是我定义的实例将替换类定义中的类型变量,因此learn :: l (Input n) -> Output n 将变为`learn:: Perceptron (V.Vector Float) (Input n) -> Output n`
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
相关资源
最近更新 更多