2016-11-13 56 views
1

将一般类型Num a => a指定为2而不是默认为某种特定类型(如IntInteger)的原理是什么?Haskell中的2类型的好奇案例

其次,我在很多地方都看过2是一个多态值,但多态的定义不承认约束变量。那么在Haskell中是多态的2

+0

对于downvoter:关心解释这个问题是不是你喜欢?我会说这是一个有趣且不明显的问题。如果你认为这个问题在某种程度上不好,请发表评论。 – Alec

+0

'2'是一个函数,完全像'(+)'或'(*)'只有空。为什么'(*)'有它的类型? '2'使用相同的原因。 (+)是多态吗? '2'也是。 –

+0

https://wiki.haskell.org/Polymorphism –

回答

4

2是多态的,所以你可以使用它作为你喜欢的任何类型的数字。 Num类型类具有功能fromInteger,在此使用。所以2真的是fromInteger (2 :: Integer)。如果2不是多态,你总是有写这个,如果你想要一个非整数,因为在Haskell没有自动强制(即你不能做(1 :: Integer) + (1 :: Int))。顺便说一下,FractionalfromRational的情况。

多态型变量可以有限制。如果他们没有约束,它被称为参数多态性如果他们这样做约束有界噪声特设多态。另请参阅HaskellWiki article on polymorphism

请注意,您不应该依赖于顶级功能的类型推断,否则您可能陷入monomorphism restriction。例如,如果你在一个模块的顶级这样写:

polymorphic = 42 

您可能希望polymorphicNum a => a类型的,但在现实中哈斯克尔将默认的polymorphic类型Integer

+0

我还想补充一点,如果不指定'2'明确的类型和类型推断不具体类型分配给'2'常量,那么一些monomorphisation发生:https://wiki.haskell.org/Monomorphism_restriction – Shersh

+0

我不确定Haskell wiki是否正确。 Typeclss引入_bounded参数多态_,与_ad hoc多态_稍有不同。但我在这里可能有些迂腐。 – Nicolas

+0

@Nicolas AFAICT他们没有什么不同。 –