【发布时间】:2019-02-11 18:43:00
【问题描述】:
一直在阅读为伟大的利益而学习 Haskell!并且在理解实例和种类方面有很大的麻烦。
Q1:所以Tofu t 中的类型t 充当了一个带有类型签名(* -> (* -> *)) -> * 的函数?而tofu 的整体签名是* -> *,不是吗?因为(* -> *) -> * 导致*,(* -> (* -> *)) -> * 也是如此
Q2:当我们要创建类型类Tofu t的Frank a b实例时,数据类型Frank a b也必须与t具有相同的类型。这意味着a 是*,b 是* -> *,b a 是(* -> *) -> *,结果是*。对吗?
Q3:tofu x 中的x 代表j a,因为两者都有* 的类型。 Frank 及其同类 (* -> (* -> *)) -> * 应用于 x。但我不确定将j a 呈现为x 将如何区分tofu x 中的x 即j a 和Frank x 中的x 即a j。
我对在数据类型或类中包含函数的想法有点陌生(例如:Frank a b 中的 b 或 Tofu t 中的 t),这有点令人困惑
我将链接留在这里,因为引用会使帖子看起来不必要地长。 link
class Tofu t where
tofu :: j a -> t a j
data Frank a b = Frank {frankField :: b a}
instance Tofu Frank where
tofu x = Frank x
【问题讨论】:
-
那是有效的代码吗?我需要打开一些扩展吗?我得到的只是编译拒绝消息。特别是,在
instance Tofu Frank等式中,t或b没有 LHS 绑定。他们来自哪里? -
除了 LYAH 显示的
:kind,还有:info,它告诉你 GHC 知道的关于你名字的一切。例如:i Tofu告诉您t的推断类型;:i Frank告诉你a, b的推断类型。 -
@AntC 我很抱歉
instance代码错误。我已经修好了。 -
谢谢。我发现了一个可学习的时刻,试图通过应用
tofu获得结果。 (将deriving Show添加到Frank的数据声明中。)写入tofu (Just "hello")会产生严重的类型错误。
标签: haskell typeclass type-kinds