Ich bin neu in der funktionalen Programmierung (kommt von Javascript), und ich habe eine harte Zeit, den Unterschied zwischen den beiden zu sagen, die auch mit meinem Verständnis von Funktoren vs. Monaden irrte.Unterschied in der Fähigkeit zwischen fmap und bind?
Functor:
class Functor f where
fmap :: (a -> b) -> f a -> f b
Monad (vereinfacht):
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
fmap
nimmt eine Funktion und eine Funktors und gibt eine Funktors.>>=
nimmt eine Funktion und eine Monade und gibt eine Monade zurück.
Der Unterschied zwischen den beiden ist in den Funktionsparameter:
fmap
-(a -> b)
>>=
-(a -> m b)
>>=
nimmt ein Funktionsparameter, der eine monadisch zurückgibt. Ich weiß, dass das wichtig ist, aber ich habe Schwierigkeiten zu sehen, wie dieses eine kleine Ding Monaden viel mächtiger macht als Funktoren. Kann jemand das erklären?
Dies ist einfacher mit der umgedrehten Version von '(>> =)', ['(= <<)'] (https://stackoverflow.com/questions/34545818/is-monad-bind-operator- Näher-Funktion-Zusammensetzung-Verkettung-oder-Funktionen/34561605 # 34561605). Mit '(g <$>) :: f a -> f b 'hat die Funktion' g :: a -> b' keinen Einfluss auf das 'f'" Umbrechen "- ändert es nicht. Mit '(k = <<) :: m a -> mb' erzeugt die Funktion' k :: a -> mb' selbst * das neue 'm'" Wrapping ", damit es sich ändern kann. –
@WillNess Ich kann das" verstehen ", aber ich Ich glaube, das eigentliche Problem, das ich habe, ist, dass ich nicht sehen kann, was '' '' 'tun kann' 'fmap' kann nicht. In meinem Kopf sind sie gleichwertig, weil ich es nicht gesehen habe ein Beispiel, das zeigt, dass fmap nicht ausreicht – m0meni
gehen Sie mit Listen, versuchen Sie, einige Elemente aus einer Liste herauszufiltern, mit 'map', das können Sie nicht, aber mit' concatMap' können Sie: 'map (\ x- > x + 1) [1,2,3] 'vs' concatMap (\ x-> [x, x + 1 | gerade x]) [1,2,3]) '. –