我可以这样创建Num a => a
:
foo :: Num a => a
foo = 2
Run Code Online (Sandbox Code Playgroud)
同样对于任何其他数字类:
foo :: Fractional a => a
foo = 2.0
Run Code Online (Sandbox Code Playgroud)
但是,我不能想办法创造型的东西Eq a => a
,Ord a => a
或任何非数(不使用undefined
).
在我看来,数字在这方面是特殊的.
是吗?
Num
从某种意义上来说它并不是"特殊的",它是唯一能够以这种方式表现的东西.但它确实具有一些使其成为可能的特征.请考虑Bounded
类型类.完全可以定义类似的功能:
top :: Bounded a => a
top = maxBound
Run Code Online (Sandbox Code Playgroud)
这是可能的,因为Bounded
,就像它的类定义的一部分Num
一样Eq
,它提供了一种创建其类型值的方法.
还有更多的例子:
def :: Default a => a
mempty :: Monoid a => a
maxBound :: Bounded a => a
toEnum 0 :: Enum a => a
read "" :: Read a => a
fromString "" :: IsString a => a
Run Code Online (Sandbox Code Playgroud)
这只是我的头脑.我相信还有更多.