Haskell - Control.Applicative.Alternative有什么作用?

31

我正在查看Haskell库中的Applicative类,并偶然发现了Alternative

这个类有什么好处?谷歌搜索没有发现任何特别有见地的东西。而且它似乎完全不合适,因为它与Applicative包捆绑在一起。

请问有人能够提供一个可能使用这个类的场景吗?

2个回答

24

这通常与解析器组合子一起使用。例如,如果space是一个匹配单个空格字符的解析器组合子,many space将匹配连续的空格。

我同意它在Control.Applicative中有些不合适。


21
有些微不足道的不协调——它是一个在Applicative上的幺半群,与MonadPlusArrowPlus具有相同的模式,它们都与它们所基于的类共享一个模块。为了保持一致性,它“应该”被称为ApplicativePlus,但那是一个不好听的名字。 - C. A. McCann
好的,这解释了很多问题!虽然将ApplicativePlus命名为Alternative并不是一件好事,因为后者具有限制其范围的内涵。 - Anupam Jain
@C. A. McCann,希望您能将您的评论转换为答案,这样我就可以接受它 :) - Anupam Jain
@Anupam Jain:嗯,我认为现在这样很好。hammar已经涵盖了它实际使用的部分,我不想重申以作出完整的回答... - C. A. McCann

17
有时候,<|> 运算符非常有用:
foldl1 (<|>) [Nothing, Just 5, Just 3]
-- Just 5

1
啊,那很有趣!在这种情况下,"<|>" 就像许多命令式语言中的短路 "||" 运算符。 - Anupam Jain
3
你也可以使用First单子和mconcat来完成这个任务。这种方法还可以很好地推广到其他的Maybe单子中。 - hammar
5
哦,不,foldl1 在某个地方使用了一个明智的默认值 (foldl (<|>) Nothing)。当你的答案崩溃时,你会怎么做? :D - Rotsor
2
在编程中,针对@Rotsor或者foldl (<|>) empty,假设empty(<|>)的身份识别标志。 - sam boosalis
3
一般来说,Data.Foldable.asum也提供了这个功能。 - abhillman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接