Fonksiyonel programlamada yeni (javascript'ten geliyor), ve ikisi arasındaki farkı anlatan zor bir zaman geçiriyorum, ki bu da aynı zamanda monoperler ve funktörleri anlayabiliyorum.Fmap ile bağlama arasındaki fark nedir?
Funktör: (basitleştirilmiş)
class Functor f where
fmap :: (a -> b) -> f a -> f b
Monad:
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
fmap
bir işlev ve functor alır ve bir functor döndürür.>>=
bir işlev ve bir monad alır ve bir monad döndürür.
ikisi arasındaki fark fonksiyonu parametrede ise:
fmap
-(a -> b)
>>=
-(a -> m b)
>>=
bir monad veren bir işlev parametresini alır. Bunun önemli olduğunu biliyorum, ancak bu küçük şeylerin monadları nasıl eğlenceli hale getirdiğini görmek zor. Birisi açıklayabilir mi?
bu daha kolay (>> =) ', [' (= <<) '] (https://stackoverflow.com/questions/34545818/is-monad-bind-operator- 'arasında ters çevrilmiş versiyonunu görülür Daha yakın için fonksiyonlu-bileşiminin zincirleme-ya da fonksiyonel/34561605 # 34561605). '(G <$>) :: f a -> f b' işleviyle, g: a -> b' işlevinin' f' 'sarması üzerinde hiçbir etkisi yoktur - değiştirmez. '(K = <<) :: m a -> mb' ile,' k 'a-> mb' işlevinin kendisi * yeni' m' sarmayı '' yaratan '' oluşturur, böylece değişebilir –
@WillNess Bunu anlayabilirim, ama ben Bunu göremiyorum, bence asıl sorun şu ki, ne yapabildiğimi göremiyorum. >> '' '' fmap'' yapamaz yapamıyorum. fmap'in yetersiz olduğunu gösteren bir örnek: – m0meni
listelere gidiyor, bir listeden bazı öğeleri filtrelemeye çalışıyorum, 'map' kullanarak. yapamazsınız, ancak concatMap' ile şunları yapabilirsiniz:' map (\ x- > x + 1) [1,2,3] 'vs concatMap (\ x-> [x, x + 1 | çift x]) [1,2,3])'. –