Po podpisie operatora >> = Monad
To jest podpis dobrze znanego operatora >> w Haskell
>>= :: Monad m => m a -> (a -> m b) -> m b
Pytanie brzmi, dlaczego typ funkcji jest
(a -> m b)
zamiast
(a -> b)
Powiedziałbym, że ten drugi jest bardziej praktyczny, ponieważ umożliwia bezpośrednią integrację istniejących „czystych” funkcji w definiowanej monadzie.
Wręcz przeciwnie, trudno jest napisać ogólny „adapter”
adapt :: (Monad m) => (a -> b) -> (a -> m b)
ale w każdym razie uważam, że bardziej prawdopodobne, że już masz(a -> b)
zamiast(a -> m b)
.
Uwaga. Wyjaśniam, co rozumiem przez „praktyczny” i „prawdopodobny”. Jeśli jeszcze nie zdefiniowałeś żadnej monady w programie, funkcje, które posiadasz, są „czyste”(a -> b)
i będziesz miał 0 funkcji tego typu(a -> m b)
tylko dlatego, że jeszcze nie zdefiniowałeśm
. Jeśli więc zdecydujesz się zdefiniować monadęm
przychodzi potrzeba posiadania nowegoa -> m b
zdefiniowane funkcje.