Wyobraź sobie, że mam wartość, która jest nazwą rodzajową nad monady:Poprawność niejawna podnoszenia
m :: (Monad m) => m A -- 'A' is some concrete type
Teraz powiedzmy, że specjalizuję się tę wartość do konkretnego transformatora monada stosie w dwóch odrębnych sposobów:
m1 :: T M A
m1 = m
m2 :: T M A
m2 = lift m
... gdzie M
i T M
są monady i T
jest transformator monada:
instance Monad M where ...
instance (Monad m) => Monad (T m) where ...
instance MonadTrans T where ...
... a te przykłady są zgodne z prawami monad i monadowymi prawami transformatora.
możemy wywnioskować, że:
m1 = m2
... nie wiedząc nic o m
innego niż tego typu?
To tylko długotrwały sposób na pytanie, czy lift m
jest prawidłowym zamiennikiem dla m
, zakładając, że oba typy kontroli. Jest trochę trudniej sformułować pytanie, ponieważ wymaga ono sprawdzenia typu jako dwie oddzielne monady przed i po podstawieniu. O ile mogę powiedzieć, jedynym sposobem takiego sprawdzenia typu byłoby sprawdzenie, czy m
jest generyczne nad monadą.
Moja mglista intuicja jest taka, że podstawienie powinno być zawsze poprawne, ale nie jestem pewien, czy moja intuicja jest poprawna, ani jak to udowodnić, jeśli jest prawidłowa.
to jest "dowód przez parametryczność" i może być exp ustąpił formalnie. Twoja argumentacja jest jednak wystarczająco dobra. –
Jasne, to tylko szkic. Przy okazji, powinienem zauważyć, że ignorowałem 'fail'. W przypadku 'fail',' m' i 'lift m' mogą zachowywać się inaczej. (Nie to, że istnieją jakiekolwiek prawa "niepowodzenia", jako takie ... Ale z rzeczywistymi transformatorami monady w 'mtl' można zrobić kontrprzykład.) – shachaf
Jestem szczególnie zainteresowany wyjaśnieniem metody parametryczności, z tego powodu, że mam bardziej wyrafinowany problem dotyczący rur. Jeśli ty lub @PhilipJF wyjaśnisz, że przyjmuję tę odpowiedź. –