我在閱讀學習你一個哈斯克爾,我已經介紹了應用程序,現在我在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