Sono un neofita della programmazione funzionale (proveniente da javascript), e ho difficoltà a capire la differenza tra i due, che è anche un po 'incasinato con la mia comprensione dei funtori contro le monadi.Differenza nella capacità tra fmap e bind?
Functor:
class Functor f where
fmap :: (a -> b) -> f a -> f b
Monade (semplificato):
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
fmap
prende una funzione e un funtore, e restituisce un funtore.>>=
prende una funzione e una monade e restituisce una monade.
La differenza tra i due è nel parametro di funzione:
fmap
-(a -> b)
>>=
-(a -> m b)
>>=
prende un parametro di funzione che restituisce una monade. So che questo è significativo, ma ho difficoltà a vedere come questa piccola cosa rende le monadi molto più potenti dei funtori. Qualcuno può spiegare?
questo è più facile visto con la versione capovolta di '(>> =)', ['(= <<)'] (https://stackoverflow.com/questions/34545818/is-monad-bind-operator- più vicino-a-funzione-composizione-chaining-o-functi/34561605 # 34561605). Con '(g <$>) :: f a -> f b', la funzione' g :: a -> b' non ha influenza sul 'f'" involucro "- non lo cambia. Con '(k = <<) :: m a -> mb', la funzione' k :: a -> mb' stesso * crea * il nuovo 'm'" involucro ", quindi può cambiare. –
@WillNess Posso" capire "questo, ma io non riesco a vederlo. Penso che il vero problema che ho è che non riesco a vedere cosa '' >> = 'può fare che' fmap' non può fare. Nella mia testa sono equivalenti perché non ho visto un esempio, che mostra che fmap è inadeguato – m0meni
andando con le liste, prova a filtrare alcuni elementi da un elenco, usando 'map'. non puoi, ma con' concatMap', puoi: 'map (\ x- > x + 1) [1,2,3] 'vs' concatMap (\ x-> [x, x + 1 | even x]) [1,2,3]) '. –