Объявление экземпляров синонимов параметризованных типов

У меня есть набор функций, которые работают с векторами, то есть списки с длинами, определяемыми типом .

Я пытаюсь упростить написание типов, т.е. вместо записи

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 мода. Можно ли создать подобный синоним типа? Есть ли у мастеров типов предложения по лучшим способам достижения моих целей?

11
задан So8res 15 February 2012 в 08:14
поделиться