如果我强迫Haskell推断出一个数字的类型,我会得到map
。例如:
load()
但Num a => a
是什么意思?
答案 0 :(得分:11)
1 :: Num a => a
表示1
有一些类型a
,其中a
是Num
类型类的实例。请注意,Num
不是类型,而是类型类,它描述了各种类型的常见属性。例如,Num
类型类描述了数字类型,因此支持基本算术。本机计算机整数类型Int
是Num
的实例,任意大小的Integer
,浮点类型Double
,甚至是有理数类型{{ 1}}。
答案 1 :(得分:7)
a => a
并不意味着什么。完整的短语是Num a => a
。这意味着" a"是Num
类型类的实例。
您也可以将其视为(Num a) => a
。它提供了一个上下文,表示a
是数字
但是,它不是a
的类型;它只是说a
应该在Num
类型类中
类型类有点像面向对象编程中的接口,因为它们定义了某些行为,而没有详细定义a
。
请注意->
和=>
之间存在差异。第一个用于功能签名;第二个用于显示类型类。
答案 2 :(得分:3)
对于类型1 :: Num a => a
中的所有类型1
,键入a
表示“a
类型为Num
”。更为简洁,这意味着“1
具有任何数字类型”。
由于此类型,您可以将1
传递给任何需要任何数字类型的函数,例如Int
,Double
等。
稍微扩展你的例子,我们也有[1,2,3] :: Num a => [a]
。这意味着“[1,2,3]
是类型a
的值列表,适用于类型a
中的所有类型Num
”。换句话说,“[1,2,3]
是任何数字类型的值列表”。
答案 3 :(得分:0)
表达式 1::Num a => a
可以分为 3 个部分以供阅读/理解。
让我们一步一步构建:
1 ::
表示 1 的类型为
c :: Char
表示 c 的类型为 Char
=> 之前的所有内容都是“类约束”,因此在 :: 和 => 之间插入 Num a
即1 :: Num a => a
表示 “1 具有 a
的类型,但不是任何类型,而是具有类约束,其中 a
是 Num 类的成员。 >