2011-08-26 52 views
28

我在看Haskell庫中的Applicative類,偶然發現了AlternativeHaskell - 什麼是Control.Applicative.Alternative對嗎?

這個班有什麼好處?谷歌搜索沒有透露任何特別有見地的東西。它似乎完全不合適,與Applicative包捆綁在一起。

有人可以發佈一個可能的場景,你會使用這個類嗎?

回答

22

它通常與解析器組合器一起使用。例如,如果space是與單個空白字符相匹配的解析器組合器,則many space將是匹配連續空白字符的解析器組合器。

雖然我可以認爲它在Control.Applicative中略有不合適。

+18

只有* *略有出來的地方 - 這是一個獨異的'Applicative's,在相同的模式'MonadPlus'和'ArrowPlus',既其中也與他們基於的課程共享一個模塊。爲了一致性,「應該」被稱爲「ApplicativePlus」,但這是一個醜陋的名字。 –

+0

好吧,這解釋了很多!雖然將'ApplicativePlus'命名爲'Alternative'並不是一件好事,因爲後者具有限制其範圍的內涵。 –

+0

@C。 A. McCann,我希望你能將你的評論轉換成答案,以便我可以接受它:) –

16

有時<|>運營商是非常有用的:

foldl1 (<|>) [Nothing, Just 5, Just 3] 
-- Just 5 
+1

啊,這很有趣!在這種情況下,<|>就像短路||在許多命令式語言中運算符.. –

+3

您也可以使用'mconcat'和['First' monoid](http://haskell.org/ghc/docs/latest/html/libraries/base/Data-Monoid。 HTML#T:第一個)。這很好地概括了[其他'也許'monoids](http://byorgey.wordpress.com/2011/04/18/monoids-for-maybe/)。 – hammar

+5

哦,不,'foldl1'被用在某個有合理默認值的地方('foldl(<|>)Nothing')。當你的回答崩潰時你會做什麼? :D – Rotsor