我在阅读学习你一个哈斯克尔,我已经介绍了应用程序,现在我在monoids。我对这两种理解都没有问题,尽管我发现应用在实践中很有用,monoid也不是那么完美。所以我想我对Haskell不了解。什么是monoids的实际使用?
首先,谈到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
有什么意义?它如何帮助我们更好地表达想法?
如果你想深入挖掘一些真正展现monid的力量的高级材料,请查看[finger trees](http://www.cs.ox.ac.uk/ralf.hinze/publications/FingerTrees.pdf )(“Data.Sequence”后面的引擎)。我敢肯定,现在我想不出有些简单的例子。 – luqui 2014-10-07 08:01:16
我建议你通过这篇出色的[Dan piponi's](http://blog.sigfpe.com/2009/01/haskell-monoids-and-their-uses.html)文章。 – Sibi 2014-10-07 08:04:18
相关,但不重复的问题:[Data.Monoid中所有这些新类型包装器的实际价值是什么](http://stackoverflow.com/questions/22080564/whats-the-practical-value-of-all-those- newtype-wrappers-in-data-monoid) – AndrewC 2014-10-07 15:54:36