У меня есть куча функций, которые работают с Vectors, т.е. списками с длинами с типом.
Я пытаюсь сделать мои типы более легкими для записи, т.е. вместо записи
foo :: (Fold Integer v, Map Integer Integer v v, ...) => ...
Я объявляю новый класс NList
, поэтому могу просто написать foo :: NList v Integer => ...
Класс (упрощенный) выглядит следующим образом:
class ( Fold (v i) i
, Map i i (v i) (v i)
, Map i (Maybe i) (v i) (v (Maybe i))
) => NList v i
Как вы можете видеть, я должен хранить "векторный" тип отдельно от типа "item" (т.е. v
отдельно от i
), чтобы я мог делать такие вещи, как Map
, на Maybe
вектор.
Таким образом, v
должен иметь вид * -> *
и i
kind *
.
Однако, когда я пытаюсь создать экземпляр с такими векторами:
instance NList Vec2 Integer
instance NList Vec3 Integer
...
Я получаю следующую ошибку:
Type synonym `Vec2' should have 1 argument, but has been given none
In the instance declaration for `NList Vec2 Integer'
Теперь, я очень новичок в программировании на уровне шрифта, и я понимаю, что, скорее всего, я сделаю это очень обратным образом. Возможно ли создать экземпляр синонима типа? У любого типа-волшебники есть предложения по лучшим способам достижения моих целей?