Jest to dobrze znany fakt, że (>>=)
mogą być realizowane z wykorzystaniem fmap
i join
podczas join
mogą być realizowane z wykorzystaniem >>=
. Czy istnieje jakiś powód, dla którego nie zdefiniowaliśmy klasy Monad
z join
uwzględnionej i przy użyciu następujących domyślnych definicji?Dlaczego nie jest `join` część klasy` Monad`
join x = x >>= id
x >>= f = join $ f <$> x
Pozwoliłoby to minimalna definicja obejmuje też tylko (>>=)
lub join
, zamiast zmuszania (>>=)
. Może być trochę pomocna, biorąc pod uwagę teorię kategorii, która preferuje join
.
Zwykłym argumentem przeciwko modyfikacji klas jest łamanie wstecznej zgodności. Jednak w tym przypadku tak by się nie stało - dodajemy tylko możliwość definiowania Monad
przy użyciu join
.
Jak mówisz, '(>> =) = dołącz. fmap', ale przed GHC 7.10 'Monad' był * nie * automatycznie funktor. W tym sensie definiujemy zarówno 'join', jak i' fmap' w 'bind'. Dużo łatwiej jest też zaimplementować '>> =' niż dołączyć. Spróbuj zrobić to dla, powiedzmy, funktora parser/stan. – AJFarmar
@AJFarmar Nie sądzę, że '(>> =) = dołącz. fmap' działa. Argumenty są odwracane i pojawiają się inne problemy. Ale dobre punkty! – Alec
Ach, masz rację, to właściwie '(dołącz). flip fmap', ale pomysł był tam, jak mówisz. – AJFarmar