Почему Haskell выводит конкретный тип (очевидно) непоследовательно?

Я нахожусь в процессе написания игрушечной (физической) векторной библиотеки, и у меня возникли проблемы с GHC, требующим, чтобы функции имели Integers в их тип. Я хочу, чтобы векторы умножали векторы, а также скаляры (просто используя *), и хотя это было возможно, просто имея Vectorinstance 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. Хотя здесь это можно исправить, включив сигнатуру типа для <.>, я хотел бы знать, что на самом деле происходит.

7
задан 12 April 2012 в 05:37
поделиться