GHCI жалуется на типы k и a внутри (k * a, k * b). Я предполагаю, что он не знает, что k является Num, но я не знаю, как это указать.
module Point where
data Point x y = Point (x, y)
class Vector v where
add :: v -> v -> v
sub :: v -> v -> v
mul :: Num k => k -> v -> v
instance (Num a, Num b) => Vector (Point a b) where
add (Point (a, b)) (Point (c, d)) = Point (a + c, b + d)
sub (Point (a, b)) (Point (c, d)) = Point (a - c, b - d)
mul k (Point (a, b)) = Point (k * a, k * b)
Ответ 1 · рейтинг 1 · Alexey Romanov
Проблема в том, что ваша подпись mul говорит, что v можно умножить на любой тип k, который имеет экземпляр Num: Int, Double, Complex Double и т. д. и т. д.
Но для векторных пространств вам нужно совсем другое: сказать, что для каждого v существует определенное k. Это можно сделать двумя способами (после исправления data Point x = Point x x как предложено в комментариях):
используя класс многопараметрического типа с функциональной зависимостью а>;
с использованием связанных типов а>.
Первоначально я дал решения, используя оба, но может быть полезнее прочитать связанную документацию и попробовать ее самостоятельно.