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