Haskell 为什么我的类型有'-&燃气轮机;约束';最后?
我正在阅读的Haskell教程有一节介绍了类型的基础知识,并描述了一个类型类Haskell 为什么我的类型有'-&燃气轮机;约束';最后?,haskell,abstract-data-type,Haskell,Abstract Data Type,我正在阅读的Haskell教程有一节介绍了类型的基础知识,并描述了一个类型类 class Tofu t where tofu :: j a -> t a j 因为有那种 * -> (* -> *) -> * 我明白,但当我在GHCi中输入:k Tofu时,我得到 Tofu :: (* -> (* -> *) -> *) -> GHC.Prim.Constraint 什么是GHC.Prim.Constraint,为什么Tofu的种
class Tofu t where
tofu :: j a -> t a j
因为有那种
* -> (* -> *) -> *
我明白,但当我在GHCi中输入:k Tofu
时,我得到
Tofu :: (* -> (* -> *) -> *) -> GHC.Prim.Constraint
什么是
GHC.Prim.Constraint
,为什么Tofu
的种类有这种形式,而不是简单的*->(*->*)->*
?t
是*->(*->*)->*
(书面t:*>(*->>)->*
)类的类型参数。
这是GHC推断出的t
类型,因为在缺少-XPolyKinds
的情况下,GHC会尝试将所有类型参数默认为kind*
。因此,GHC假定a
具有种类*
(尽管您的签名中没有任何内容使其成为唯一的选择)
类型构造函数(>)
具有种类*->*->*
。由于ja
显示为(>)
的参数,ja
必须具有种类*
。由于GHC假定a
具有种类*
,j
是一种类型,它接受某种*
并返回某种*
。因此:
j :: * -> *
由于t
同时应用于a
和j
,t
具有种类*->(*->*)->*
,因为第一个参数a
具有种类*
,第二个参数j
具有种类*->*
,而整个类型taj
必须具有种类*
,因为它也是类型(>)
的一个参数
类只是采用类型参数的类型(就像datafooab
),除了fooab
具有种类*
而tofut
具有特殊种类约束之外。因此,豆腐的种类是:
(* -> (* -> *) -> *) -> Constraint
正如GHC所指出的那样<代码>约束
就是给定给约束的类型。在签名中
(Num a) => a -> a -> a
(Num a)
是一种约束
我几乎能理解,但我是个初学者。你能详细解释一下吗?如果我看一下:t豆腐
,其实就不那么神秘了。虽然我还是有点迷雾,谢谢。我得到了导致*->(*->*)->*
的推理链。我正在努力解决的是如何将其融入到更大的图景中,特别是“类获取类型参数并返回约束
”@raxacoricofallapatorius将类型类声明视为定义特殊数据类型(约束,尽管它们通常被称为字典)。因此,您的类Tofu
定义了一个类型约束
。它有一个参数t
,它的种类*->(*->*)->*
,因此类型构造函数Tofu
的类型是从t
类型到约束类型的函数。如果Tofu
有两个参数t
和s
,那么Tofu
的类型将是“type oft
”->
“type ofs
”约束,为了更好地理解类
和实例
声明,了解它们如何翻译成核心
是件好事class
es成为字典的data
声明(或Constraint
s,如果需要),而instance
s成为字典中的函数(即,给定某些Constraint
s(父类上下文),它们返回一个新的Constraint
,表示当前实例).