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的种

我正在阅读的Haskell教程有一节介绍了类型的基础知识,并描述了一个类型类

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 of
t
->
“type of
s
”约束,为了更好地理解
实例
声明,了解它们如何翻译成
核心
是件好事
class
es成为字典的
data
声明(或
Constraint
s,如果需要),而
instance
s成为字典中的函数(即,给定某些
Constraint
s(父类上下文),它们返回一个新的
Constraint
,表示当前实例).