如果我强制Haskell推断一个数字的类型,我会得到Num a => a
。例如:Haskell类型系统中的`Num a => a`是什么意思?
Prelude> :t 1
1 :: Num a => a
但什么是a => a
是什么意思?
如果我强制Haskell推断一个数字的类型,我会得到Num a => a
。例如: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
类型的,对于所有类型的a
在类型类Num
”。更确切地说,这意味着“1
是任何数字类型”。
由于这种类型的,你可以通过1
到需要的任何数字类型的任何功能,如Int
,Double
等
扩展您的例子一点,我们也有[1,2,3] :: Num a => [a]
。这意味着“[1,2,3]
是类型a
的值的列表,对于类型Num
中的所有类型a
”。换句话说,“[1,2,3]
是任何数字类型的值的列表”。
这可能会回答你的问题,http://stackoverflow.com/a/3742700/5781248 –