为什么我的类型最后有'-> Constraint'?



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

class Tofu t where  
    tofu :: j a -> t a j 

的类型

* -> (* -> *) -> *

我明白,但是当我在GHCi中输入:k Tofu时,我得到

Tofu :: (* -> (* -> *) -> *) -> GHC.Prim.Constraint

什么是GHC.Prim.Constraint ?为什么Tofu有这种形式而不是简单的* -> (* -> *) -> * ?

t* -> (* -> *) -> *类(写为t :: * -> (* -> *) -> *)的Tofu类的类型参数。这是GHC推断的t类型,因为在没有-XPolyKinds的情况下,GHC尝试将所有类型参数默认为*类型。因此,GHC假设a具有*类型(尽管您的签名中没有任何内容使这成为唯一的选择)。

类型构造函数(->)具有类型 * -> * -> *。因为j a是作为(->)的参数出现的,所以j a的类型必须是*。由于GHC假定a具有*类型,因此j是一个接受*类型的东西并返回*类型的东西的类型。因此:
j :: * -> *

由于t同时应用于aj,因此t的类型为* -> (* -> *) -> *,因为第一个参数a的类型为*,第二个参数j的类型为*->*,并且整体类型t a j 必须具有*的类型,因为它也是(->)类型的参数。

类只是带类型参数的类型(和data Foo a b一样),不同的是Foo a b*类,Tofu tConstraint类。因此,Tofu的类型为:

(* -> (* -> *) -> *) -> Constraint

如GHC所示。Constraint只是给约束的那种。在签名

(Num a) => a -> a -> a

(Num a)是一种 Constraint

相关内容

最新更新