为什么Haskell会推断一个特定类型(显然)不一致?

时间:2012-04-12 05:37:47

标签: haskell type-inference

我正在编写一个玩具(物理)矢量库,并且遇到GHC问题,因为函数应该在其类型中有Integer个。我想要向量乘以向量,以及标量(只使用*),虽然只有Vector实例Num这是可能的,我现在得到的排序错误:

Couldn't match expected type `Integer' with actual type `Double'

在玩完代码以解决问题之后我已经把它归结为:

data V a = V a a a deriving (Show, Eq, Functor)
scale a (V i j k) = V (a*i) (a*j) (a*k)
(<.>) = scale

现在,如果我们问GHCi我们得到的是什么类型:

>:t scale
scale :: Num a => a -> V a -> V a
>:t (<.>)
(<.>) :: Integer -> V Integer -> V Integer

我们当然不希望<.>仅对Integer采取行动。虽然这可以通过包含<.>的类型签名来解决,但我想知道实际发生了什么。

1 个答案:

答案 0 :(得分:15)

你正在遇到臭名昭着的monomorphism restriction。另一种解决方案是明确指定参数:

a <.> v = scale a v

或添加-XNoMonomorphismRestriction pragma。