Haskell的Pairs类型

Ang*_*nes 1 haskell types ghci

我正在尝试理解Haskell的类型系统.我发现了以下内容:

*Main> :t ("Hello", 4)
("Hello", 4) :: Num t => ([Char], t)

*Main> :t ("Hello", 'a')
("Hello", 'a') :: ([Char], Char)

*Main> :t ("Hello", True)
("Hello", True) :: ([Char], Bool)
Run Code Online (Sandbox Code Playgroud)

为什么类型("Hello", 4)不像其他类型那样表示.我原以为是("Hello", 4) :: ([Char], Num)

=>之前已经看过了.我想知道的是,为什么它会产生这种差异?

And*_*ács 11

那是因为Num不是一种类型; 它是一个类型类,Num t => someType意味着它t是一些任意类型,它是Num类型类的一个实例.借用一些Java/C#术语,您可以将其Num视为一个接口,并且Num t => t是具有t必须实现Num接口的约束的泛型类型.

通常,您会在=>箭头左侧找到类型类约束,在右侧找到类型主体.例如(Num a, Num b) => (a, b),我们可以有多个类约束,它们表示两个任意数字类型的元组的类型.我们也可以有零类约束,在这种情况下=>省略.

在Haskell中,数字文字可以表示作为实例的任何类型Num.文字4可以表示浮点数或整数,或者(如果你定义一些更奇特的实例)甚至是函数.