У меня есть класс:
import Linear
class Coordinate c where
rotate :: Num a => Quaternion a -> c a -> c a
translate :: Num a => V3 a -> c a -> c a
, для которого я определил экземпляры
instance Coordinate V3 where
rotate _ = id
translate p = (p+)
instance Coordinate Quaternion where
rotate o = (o*)
translate _ = id
Теперь я хочу определить экземпляр для пары членов класса.
instance (Coordinate a, Coordinate b) => Coordinate (a, b) where
rotate o (a, b) = (rotate o a, rotate o b)
translate p (a, b) = (translate p a, translate p b)
Проблема в том, что это не работает, так как компилятор ожидает аргумент для a
и b
. Однако добавление ограничения типа, например
instance (Coordinate a, Coordinate b, Num c) => Coordinate (a c, b c) where
move p (a, b) = (move p a, move p b)
translate p (a, b) = (translate p a, translate p b)
Это тоже не работает, так как в результате получается выражение вида *
, а не * -> *
. Я вижу, что оба вышеперечисленных варианта неверны, но я не уверен, как это решить. Я предполагаю, что должно быть какое-то ограничение, которое сохраняет типы Num
для обоих a
и b
одинаковыми, но я не знаю, как это будет выглядеть синтаксически.