Znalazłem następującą instancję klasy: (Monad m, (~) * a()) => LaTeXC (LaTeXT m a)
, ale nie mogę w pełni zrozumieć jej kontekstu.Co oznacza ten kontekst: (Monad m, (~) * a())?
Co oznacza (~) * a()
? Gdzie mogę o tym przeczytać?
Znalazłem następującą instancję klasy: (Monad m, (~) * a()) => LaTeXC (LaTeXT m a)
, ale nie mogę w pełni zrozumieć jej kontekstu.Co oznacza ten kontekst: (Monad m, (~) * a())?
Co oznacza (~) * a()
? Gdzie mogę o tym przeczytać?
(~)
jest równość typu poziom (można napisać go jako pewnego wariantu =
lub ==
, ale była opinia, że ten zapis miał już wystarczająco dużo różnych znaczeń, że wprowadzenie innego byłoby mylące). *
jest tego rodzaju. Tak więc (~) *
jest twierdzeniem, że dwa typy (mieszkalne) są równe. Innymi słowy, instancja może również być napisane tak:
instance Monad m => LaTeXC (LaTeXT m())
Dlaczego nie było? Cóż, to kwestia wnioskowania. Sposób, w jaki został napisany, powoduje, że kompilator wybiera to wystąpienie, nawet jeśli nie wie (jeszcze), że ostateczny argument do LaTeXT
to ()
, następnie wymusza to, podczas gdy proponowana alternatywna instancja po prostu narzekałaby.
Widziałem tylko tę pisownię jako 'a ~()' i wyobrażam sobie, że wersją prefiksu będzie '(~) a()'. Jak do tego przychodzi rodzaj '*'? Nie jest to wspomniane w dokumentacji [ograniczenia równości] (https://downloads.haskell.org/~ghc/7.8.4/docs/html/users_guide/equality-constraints.html). – Cirdec
@Cirdec Tak, to niefortunne, ale GHC nie ujawnia składni na poziomie użytkownika dla specyficznego dla rodzaju '~'. Jednakże w swoim języku wewnętrznym '~' przyjmuje rodzaj argumentu (a zatem, gdy jest stosowany, musi być zastosowany do rodzaju). Te rodzaje są wstawiane przez rodzaj wnioskowania, podobnie jak nieumiejętne "allele" Haskella są przekształcane w polimorfizm typu, a aplikacje typu są implicite według wnioskowania typu. GHC wie wystarczająco dużo o tym, aby usunąć niejawne rodzaje podczas drukowania, ale plamiak nie robi rozbierania. –
To w pełni odpowiada na moje pytanie, dzięki! Widziałem też to tylko jako "a ~()" i nie mogłem sobie nawet wyobrazić, że "~" ma dobry argument. –