Learn You a Haskellを読んでいて、すでに applicative について説明しましたが、今はモノイドに取り組んでいます。両方を理解するのに問題はありませんが、実際には applicative が有用であることがわかりましたが、monoid はそうではありません。だから、Haskell について何かを理解していないと思います。
まず、 について言えば、Applicative
「コンテナ」に対してさまざまなアクションを実行するための統一された構文のようなものを作成します。したがって、通常の関数を使用してMaybe
、 、リスト、IO
(モナドと言った方がいいでしょうか? モナドはまだわかりません)、関数に対してアクションを実行できます。
λ> :m + Control.Applicative
λ> (+) <$> (Just 10) <*> (Just 13)
Just 23
λ> (+) <$> [1..5] <*> [1..5]
[2,3,4,5,6,3,4,5,6,7,4,5,6,7,8,5,6,7,8,9,6,7,8,9,10]
λ> (++) <$> getLine <*> getLine
one line
and another one
"one line and another one"
λ> (+) <$> (* 7) <*> (+ 7) $ 10
87
したがって、適用可能は抽象化です。私たちはそれがなくても生きていけると思いますが、いくつかのアイデアモードを明確に表現するのに役立ちます.
では、 を見てみましょうMonoid
。それは抽象化でもあり、かなり単純なものでもあります。しかし、それは私たちを助けますか?本のすべての例について、物事を行うためのより明確な方法があることは明らかです。
λ> :m + Data.Monoid
λ> mempty :: [a]
[]
λ> [1..3] `mappend` [4..6]
[1,2,3,4,5,6]
λ> [1..3] ++ [4..6]
[1,2,3,4,5,6]
λ> mconcat [[1,2],[3,6],[9]]
[1,2,3,6,9]
λ> concat [[1,2],[3,6],[9]]
[1,2,3,6,9]
λ> getProduct $ Product 3 `mappend` Product 9
27
λ> 3 * 9
27
λ> getProduct $ Product 3 `mappend` Product 4 `mappend` Product 2
24
λ> product [3,4,2]
24
λ> getSum . mconcat . map Sum $ [1,2,3]
6
λ> sum [1..3]
6
λ> getAny . mconcat . map Any $ [False, False, False, True]
True
λ> or [False, False, False, True]
True
λ> getAll . mconcat . map All $ [True, True, True]
True
λ> and [True, True, True]
True
そこで、いくつかのパターンに気付き、新しい型クラスを作成しました...いいですね、私は数学が好きです。しかし、実用的な観点からは、何のポイントMonoid
ですか? アイデアをよりよく表現するのにどのように役立ちますか?