我正在阅读《Haskell趣学指南》(Learn You a Haskell),已经学完了应用和现在正在学习单子(monoids)。我没有问题理解这两个概念,虽然我发现应用在实践中很有用,而单子则不太一样。所以我认为我可能对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
因此,applicative是一种抽象概念。我认为我们可以没有它,但它有助于更清晰地表达某些想法,这很好。
现在,让我们来看看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
有什么意义呢?它如何帮助我们更好地表达想法?
Data.Sequence
背后的引擎)。我相信现在我无法想到更简单的例子。 - luqui