私は関数型プログラミング(JavaScriptから来て)には新しく、2つの違いを伝えるのは苦労しています。これは、ファンクターとモナドの理解にも困惑しています。fmapとbindの機能の違いは?
ファンクタ:
class Functor f where
fmap :: (a -> b) -> f a -> f b
モナド(簡体字):
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
- 機能とファンクタをとり、ファンクタを返します。
>>=
は、関数とモナドをとり、モナドを返します。
fmap
2つの違いは、関数のパラメータである:
- -
(a -> b)
>>=
から(a -> m b)
fmap
>>=
はモナドを返す関数のパラメータを取ります。私はこれが重要であることを知っていますが、この1つの小さなことがどのようにしてモナドをどのようにしてファンクタよりもずっと強力にするのかを見るのが難しいです。誰か説明できますか?
これは、反転されたバージョンの '(>> =)'、['(= <<)'](https://stackoverflow.com/questions/34545818/is-monad-bind-operator- function-composition-chaining-fun-fun/34561605#34561605)を使用して作成することができます。 '(g <$>):: f a - > f b'では、' g :: a - > b'関数は 'f'" wrapping "に影響を与えません。 '(k = <<) :: m a -> mb'で、関数' k :: a - > mb'それ自体は新しい 'm''ラッピングを作成するので変更可能です。 –
@WillNessこれを"理解する "ことはできますが、実際の問題は、 '' fmap'はできないことを '' = ''できないことが分かりません。私の頭の中では、私が見たことがないので同等ですfmapが不十分であることを示す例です。 – m0meni
リストを使って、リストからいくつかの要素を 'map'を使ってフィルタリングしようとしますが、' concatMap'を使うと 'map(\ x- > x + 1)[1,2,3] 'vs' concatMap(\ x-> [x、x + 1 |偶数x])[1,2,3]) 'となります。 –