Przez to, rozumiem, że funkcja >> zawsze zwraca jego prawą parametru niezależnie od wartości lewa
Jest źródłem twojego zamieszania!
m >>= f
wywołuje f
do określenia wartości „znajduje się wewnątrz” m
„łączenie” wyniki (w których co to znaczy wartości do „Znaleziono wewnątrz” w jednowartościowy wartość i co to znaczy „połączenie” jest monada-specyficzne) .
m >> n
musi być równoważny z m >>= \_ -> n
. Tak więc dla każdej wartości znajduje się wewnątrz m
, to wywoła na nim \_ -> n
. Ale Nothing
w monadzie Maybe
nie ma wartości "wewnątrz" tej wartości. Tak więc \_ -> n
nie można nawet wywołać niczego, aby go zignorować i zwrócić n
! Tak więc Nothing >>= \_ -> n
musi zwrócić coś, co nie zależy od n
, ponieważ nie ma możliwości wywoływania funkcji w celu uzyskania n
. W tym kontekście nie ma również żadnych wartości owiniętych typów, więc jedyną dostępną opcją jest po prostu Nothing
.
Więc zamiast intuicji, aby zrozumieć, że ignoruje lewą i zwraca to, co jest po prawej, lepiej jest myśleć, że zajmuje ona "monadyczną strukturę" tego, co jest po lewej i wiąże ją z monadyczną wartością na prawo. "Monadyczna struktura" jest ręcznym terminem określającym "wszystko, co definiuje monadyczną wartość inną niż wartości wewnątrz niej".
listA >> listB
robi to samo niezależnie od konkretnych wartości w listA
, ale ma znaczenie, ile elementów w nim jest. ioA >> ioB
robi to samo, bez względu na to, jaka wartość jest wytwarzana przez wykonanie ioA
, ale ma znaczenie, czy efekty uboczne zostały wykonane w celu jej wyprodukowania. stateA >> stateB
ignoruje wartość produkowaną przez stateA
, ale wysyła bieżący stan do stateB
. I maybeA >> maybeB
robi to samo niezależnie od konkretnej wartości wewnątrz maybeA
, ale ma znaczenie, czy istnieje wartość, czy nie. Zwróć uwagę, że przypadek listy zachowuje się bardzo podobnie do Maybe
; jeśli listA
jest pusty, wtedy listA >> listB
musi być pusty.
Co do twojego pytania o bonus, kiedy czytam sobie kod (w mojej głowie), wymawiam zarówno >>=
jak i >>
jako "bind"; kiedy jestem szukając przy kodzie, a także wymawiając go, jest wystarczająco niewerbalna świadomość kontekstu, że ta niejednoznaczność nie ma znaczenia.Właściwie nie wiem, co chciałbym powiedzieć na głos z kimś o >>=
i >>
; może "bindować" i "zapomnieć o bindach"?
Ah, oczywiście ... Tego właśnie mi brakowało. Dzięki! – Buzu