[英]What does `Num a => a` mean in Haskell type system?
如果我强制 Haskell 推断数字的类型,我会得到Num a => a
。 例如:
Prelude> :t 1
1 :: Num a => a
但是a => a
是什么意思?
1:: Num a => a
表示1
具有某种类型a
,其中a
是Num
类型类的一个实例。 注意Num
不是类型,而是类型类,它描述了各种类型的公共属性。 例如, Num
类型类描述了数字类型,因此支持基本算术。 本机整数类型Int
是Num
的实例,任意大小的Integer
、浮点类型Double
甚至有理数类型Rational
也是。
a => a
没有任何意义。 完整的短语是Num a => a
。 这意味着“a”是Num
类型类的一个实例。
您也可以将其读作(Num a) => a
。 它提供了一个上下文来说明a
是数字。
但是,它不是a
的类型; 它只是说a
应该在Num
类型类中。
类型类有点像面向对象编程中的接口,因为它们定义a
某些行为,但没有详细定义。
请注意->
和=>
之间是有区别的。 第一个用于函数签名; 第二个用于显示类型类。
输入1:: Num a => a
意味着“ 1
是类型a
,对于类型类Num
中的所有类型a
”。 更简洁地说,它意味着“ 1
是任何数字类型”。
由于这种类型,您可以将1
传递给任何需要任何数字类型的函数,例如Int
、 Double
等。
稍微扩展您的示例,我们还有[1,2,3]:: Num a => [a]
。 这意味着“ [1,2,3]
是类型a
的值列表,对于类型类Num
中的所有类型a
”。 换句话说,“ [1,2,3]
是任何数字类型的值列表”。
表达式1::Num a => a
可以分解为 3 个部分以便于阅读/理解。
让我们一步步构建:
1::
表示1 的类型为
c:: Char
表示c 的类型为 Char
=> 之前的所有内容都是“类约束” ,因此在 :: 和 => 之间插入Num a
即1:: Num a => a
表示“1 具有a
的类型,但不仅是任何类型,而且具有类约束,其中a
是 Num 类的成员。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.