2015-01-17 14 views

Odpowiedz

6

(~) 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.

+3

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

+5

@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. –

+1

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. –