Say Pisałem następujące amazin kawałek kodu:"<-" i wartości związanych
func = do
a <- Just 5
return a
To dość bezcelowe, wiem. Tutaj a
jest 5
i func
zwraca Just 5
.
Teraz przerobić moje niesamowite funkcji (jeszcze bezsensowną):
func' = do
a <- Nothing
return a
Funkcja ta zwraca Nothing
, ale co do cholery jest a
? Nie ma nic, aby wyodrębnić z wartości Nothing
, ale program nie jęcz, kiedy robię coś takiego:
func'' = do
a <- Nothing
b <- Just 5
return $ a+b
prostu trudno zobaczyć, co faktycznie się dzieje. Co to jest a
? Innymi słowy: co robi teraz? Mówienie "wyodrębnia wartość z prawej strony i wiąże ją z lewą stroną", oczywiście upraszcza ją. Czego nie dostaję?
Dzięki :)
'<-' tłumaczy się na" >>. W przypadku monady "Maybe", jeśli pierwszym argumentem (tj. Częścią prawa do '<-') jest" Nic ", nic innego nie jest oceniane, a' >> = 'po prostu zwraca' Nothing'. Tak więc, aby odpowiedzieć na twoje pytanie: egzekucja nie ma nawet _reach_ "a". – Vitus
Myśląc o monadach jako kontenerach, notacja doładowania pozwala przypisać etykiety do wartości (jeśli występują) wewnątrz monad, a następnie zdefiniować funkcje, które zostaną zastosowane do tych wartości. Ale ekstrakcja jest iluzją - funkcje są stosowane wewnątrz monady (używając '>> ='), ponieważ nie ma ogólnego sposobu wydobycia wartości z monady. Zwróć uwagę, jak kończysz każdy blok do-do-bloku, umieszczając wynik _back w monad_, często używając 'return'. Nigdy tak naprawdę nie miałeś zmiennej "a", która byłaby równa 5. – Nefrubyr