Jestem nowicjuszem w zakresie programowania funkcjonalnego (pochodzącego z javascript) i ciężko mi jest odróżnić te dwie rzeczy, co jest również męczące z moim rozumieniem funktorów kontra monad.Różnica w zdolnościach między fmap i bind?
funktora:
class Functor f where
fmap :: (a -> b) -> f a -> f b
Monada (uproszczonych)
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
fmap
wykonuje funkcję i funktora i zwraca funktor.>>=
przyjmuje funkcję i monadę i zwraca monadę.
Różnica między nimi polega na parametr funkcyjny:
fmap
-(a -> b)
>>=
-(a -> m b)
>>=
przyjmuje parametr funkcyjny zwraca monadę. Wiem, że to jest znaczące, ale mam trudności z zobaczeniem, jak ta jedna drobna rzecz sprawia, że monady są znacznie potężniejsze niż funktory. Czy ktoś może wyjaśnić?
jest to łatwiejsze w przypadku odwróconej wersji '(>> =)', ['(= <<)'] (https://stackoverflow.com/questions/34545818/is-monad-bind-operator- bliżej funkcji-kompozycji-łączenia-lub-functi/34561605 # 34561605). Z '(g <$>) :: f a -> f b', funkcja' g :: a -> b' nie ma wpływu na owijanie 'f'" - nie zmienia tego. Z '(k = <<) :: m a -> mb', funkcja' k :: a -> mb' sama * tworzy * nowe "m" owijanie ", więc może się zmienić –
@WillNess Mogę" zrozumieć "to, ale ja Nie widzę tego. Myślę, że prawdziwym problemem, jaki mam, jest to, że nie widzę tego, co '>> =' może zrobić, czego 'fmap' nie może zrobić, w mojej głowie są one równoważne, ponieważ nie widziałem przykład, który pokazuje, że fmap jest niewystarczająca, – m0meni
przechodzenie z listami, spróbuj odfiltrować niektóre elementy z listy, używając 'map' .nie możesz, ale z' concatMap', możesz: 'mapować (\ x- > x + 1) [1,2,3] 'vs' concatMap (\ x-> [x, x + 1 | nawet x]) [1,2,3]) '. –