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