Mam wiele funkcji, które działają na wektory, tj. Listy z wymuszonymi typami długościami.Deklarowanie wystąpień sparametryzowanych typów synonimów
Próbuję aby moje typy łatwiej napisać, to znaczy zamiast pisać
foo :: (Fold Integer v, Map Integer Integer v v, ...) => ...
mam uznającą nową klasę NList
więc mogę tylko napisać foo :: NList v Integer => ...
The (uproszczony) klasy wygląda następująco:
class (Fold (v i) i
, Map i i (v i) (v i)
, Map i (Maybe i) (v i) (v (Maybe i))
) => NList v i
jak widać, mam zachować „wektor” typ odrębny od „pozycji” typu (tzn v
oddzielny od i
), aby móc wykonywać operacje takie jak Map
na wektorach Maybe
.
Jako takie, v
musi mieć rodzaj * -> *
i i
rodzaj *
.
Jednak gdy próbuję instancję wektorami tak:
instance NList Vec2 Integer
instance NList Vec3 Integer
...
pojawia się następujący błąd:
Type synonym `Vec2' should have 1 argument, but has been given none
In the instance declaration for `NList Vec2 Integer'
Teraz jestem bardzo nowy typ poziomie programowania, i rozumiem, że prawdopodobnie robię to w bardzo zacofany sposób. Czy możliwe jest utworzenie takiego synonimu typu? Czy każdy typ-czarodziej ma sugestie dotyczące lepszych sposobów na osiągnięcie moich celów?
Bardzo fajne, dzięki. Jedyne, czego nie dostaję, to ostatni przykład. Co słychać u operatora tyldy? – So8res
To jest [ograniczenie równości] (http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/equality-constraints.html). Jeśli masz ograniczenie 'Num a' w zakresie, możesz użyć operatorów arytmetycznych na wartościach typu' a'; jeśli masz ograniczenie '(a ~ b)' w zakresie, możesz użyć wartości 'a' jako wartości' b' i na odwrót. Zasadniczo możesz przeczytać '(n ~ Z) => r' jako" udowodnij mi, że 'n' jest' Z', a dam ci 'r''. – ehird