为什么替代连接列表而不是选择第一个非空列表?

Nik*_*kov 5 haskell alternative-functor

从类的名称和解析器中的用法来看,Maybe我认为它的行为是从 中选择第一个非空输入a <|> b <|> c。所以我期望输入

[] <|> [1] <|> [2, 3]
Run Code Online (Sandbox Code Playgroud)

它将返回第一个非空列表,即:

[1]
Run Code Online (Sandbox Code Playgroud)

但它实际上只是连接了整个事情,产生:

[1,2,3]
Run Code Online (Sandbox Code Playgroud)

所以我想知道这样的实施背后的原因是什么?它实际上是正确的吗?

http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Applicative.html#t:Alternative

PS 是否有任何标准功能可以达到我的预期Alternative

Pet*_*lák 3

当实现Alternative f( 或MonadPlus f) 实例时,您必须选择一个幺半群并使用和 来f a实现它。对于某些结构,例如列表,可能有多种可能性。列表最自然的幺半群操作是它们的串联(作为单位元素)。正如您所建议的,采用第一个非空元素也是一种可能性,但对于列表来说并不那么自然。您的操作几乎忽略列表的结构(长度),它只检查列表是否为空。它没有添加任何新内容,因为这种幺半群运算已经可以作为 的实例使用,它旨在表示(非)空值。empty<|>[]MaybeAlternative

MonadPlus这也体现在of的实例中[]正如HaskellWiki上所述,对于 的实例有两组可能的定律MonadPlus

  • Monoid + LeftZero + LeftDistribution - 统计为[]
  • Monoid + LeftZero + LeftCatch - 由MaybeIO和统计STM

如果我们选择Alternative和的实现MonadPlus,那么我们将只有满足 的实例... + LeftCatch,而没有满足 LeftDistribution 的实例。再说一遍,MonadPlusof与of[]并没有太大区别。而且我们不会有任何东西可以让我们解决诸如send+more=money 之类的问题。所以选择/ of来连接就更有趣了。MonadPlusMaybemplus<|>[]