7

我正在编写一个玩具(物理)向量库,并且在 GHC 坚持函数Integer的类型中应该有 s 时遇到问题。我希望向量乘以向量以及标量(仅使用*),虽然这可以通过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

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

4

1 回答 1

15

您遇到了臭名昭著的单态性限制。另一种解决方案是明确指定参数:

a <.> v = scale a v

或添加-XNoMonomorphismRestriction编译指示。

于 2012-04-12T05:46:00.613 回答