У меня есть куча функций, которые работают с 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'
Теперь, я очень новичок в программировании на уровне шрифта, и я понимаю, что, скорее всего, я сделаю это очень обратным образом. Возможно ли создать экземпляр синонима типа? У любого типа-волшебники есть предложения по лучшим способам достижения моих целей?