Haskell-Control.Applicative.Alternative的用途是什么?

Haskell-Control.Applicative.Alternative的用途是什么?,haskell,applicative,alternative-functor,Haskell,Applicative,Alternative Functor,我在看Haskell库中的Applicative类时,偶然发现了备选方案 这门课有什么用?谷歌搜索并没有透露任何特别有见地的信息。而且它似乎完全不合适,因为它与应用程序包捆绑在一起 有人可以发布一个可能使用这个类的场景吗?它通常与解析器组合器一起使用。例如,如果space是匹配单个空格字符的解析器组合符,many space将是匹配连续空格的解析器组合符 我可以同意,它在控制中有点不合适。不过,应用性。有时操作符非常有用: foldl1 (<|>) [Nothing, Just 5,

我在看Haskell库中的
Applicative
类时,偶然发现了
备选方案

这门课有什么用?谷歌搜索并没有透露任何特别有见地的信息。而且它似乎完全不合适,因为它与应用程序包捆绑在一起


有人可以发布一个可能使用这个类的场景吗?

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

我可以同意,它在
控制中有点不合适。不过,应用性

有时
操作符非常有用:

foldl1 (<|>) [Nothing, Just 5, Just 3]
-- Just 5
foldl1()[没有,只有5个,只有3个]
--只有5个

只是有点不合适——它是
Applicative
s上的一个幺半群,与
MonadPlus
ArrowPlus
的模式相同,两者也与它们所基于的类共享一个模块。为了一致性,它“应该”被称为
ApplicativePlus
,但这是一个难听的名字。好吧,这解释了很多!虽然将
ApplicativePlus
命名为
Alternative
并不是一件好事,因为后者的含义限制了它的范围。@C.a.麦肯,我希望你能将你的评论转换成一个答案,这样我就可以接受了:)@Anupam Jain:嗯,我认为这很好。哈马尔已经谈到了它的实际使用位置,我不想重复这一点来给出完整的答案……啊,这很有趣!在这种情况下,类似于许多命令式语言中的短路| |运算符。您也可以使用
mconcat
with来执行此操作。这很好地概括为。哦,不,
foldl1
被用于存在合理默认值的地方(
foldl()Nothing
)。当你的答案崩溃时,你会怎么做D@Rotsor或者通常为
foldl()empty
,假定
empty
通常是
()
的标识,
Data.Foldable.asum也提供此功能