将一般类型Num a => a
指定为2
而不是默认为某种特定类型(如Int
或Integer
)的原理是什么?Haskell中的2类型的好奇案例
其次,我在很多地方都看过2
是一个多态值,但多态的定义不承认约束变量。那么在Haskell中是多态的2
?
将一般类型Num a => a
指定为2
而不是默认为某种特定类型(如Int
或Integer
)的原理是什么?Haskell中的2类型的好奇案例
其次,我在很多地方都看过2
是一个多态值,但多态的定义不承认约束变量。那么在Haskell中是多态的2
?
2
是多态的,所以你可以使用它作为你喜欢的任何类型的数字。 Num
类型类具有功能fromInteger
,在此使用。所以2
真的是fromInteger (2 :: Integer)
。如果2
不是多态,你总是有写这个,如果你想要一个非整数,因为在Haskell没有自动强制(即你不能做(1 :: Integer) + (1 :: Int)
)。顺便说一下,Fractional
与fromRational
的情况。
多态型变量可以有限制。如果他们没有约束,它被称为参数多态性如果他们这样做约束,有界噪声或特设多态。另请参阅HaskellWiki article on polymorphism。
请注意,您不应该依赖于顶级功能的类型推断,否则您可能陷入monomorphism restriction。例如,如果你在一个模块的顶级这样写:
polymorphic = 42
您可能希望polymorphic
为Num a => a
类型的,但在现实中哈斯克尔将默认的polymorphic
类型Integer
。
对于downvoter:关心解释这个问题是不是你喜欢?我会说这是一个有趣且不明显的问题。如果你认为这个问题在某种程度上不好,请发表评论。 – Alec
'2'是一个函数,完全像'(+)'或'(*)'只有空。为什么'(*)'有它的类型? '2'使用相同的原因。 (+)是多态吗? '2'也是。 –
https://wiki.haskell.org/Polymorphism –