【发布时间】:2011-05-09 22:20:18
【问题描述】:
数值字面量具有多态类型:
*Main> :t 3
3 :: (Num t) => t
但是如果我将一个变量绑定到这样的文字上,多态性就会丢失:
x = 3
...
*Main> :t x
x :: Integer
另一方面,如果我定义一个函数,它当然是多态的:
f x = 3
...
*Main> :t f
f :: (Num t1) => t -> t1
我可以提供一个类型签名来确保 x 保持多态性:
x :: Num a => a
x = 3
...
*Main> :t x
x :: (Num a) => a
但为什么这是必要的?为什么不推断多态类型?
【问题讨论】:
-
会有什么不同吗? (我真的不知道,虽然我怀疑不是)
-
它确实有所作为;我希望类型尽可能通用。
-
再来?无论
x是Integer还是Num a => a,您都可以将它传递给任何需要Num的函数。函数必须是通用的,值不是。 -
@delnan:但您不能将它传递给需要
Int的函数。 -
@sepp2k:啊,那是缺失的部分。谢谢。
标签: haskell polymorphism type-inference monomorphism-restriction