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)
所以我想知道这样的实施背后的原因是什么?它实际上是正确的吗?
PS 是否有任何标准功能可以达到我的预期Alternative?
当实现Alternative f( 或MonadPlus f) 实例时,您必须选择一个幺半群并使用和 来f a实现它。对于某些结构,例如列表,可能有多种可能性。列表最自然的幺半群操作是它们的串联(作为单位元素)。正如您所建议的,采用第一个非空元素也是一种可能性,但对于列表来说并不那么自然。您的操作几乎忽略列表的结构(长度),它只检查列表是否为空。它没有添加任何新内容,因为这种幺半群运算已经可以作为 的实例使用,它旨在表示(非)空值。empty<|>[]MaybeAlternative
MonadPlus这也体现在of的实例中[]。正如HaskellWiki上所述,对于 的实例有两组可能的定律MonadPlus:
[]Maybe、IO和统计STM。如果我们选择Alternative和的实现MonadPlus,那么我们将只有满足 的实例... + LeftCatch,而没有满足 LeftDistribution 的实例。再说一遍,MonadPlusof与of[]并没有太大区别。而且我们不会有任何东西可以让我们解决诸如send+more=money 之类的问题。所以选择/ of来连接就更有趣了。MonadPlusMaybemplus<|>[]
| 归档时间: |
|
| 查看次数: |
1093 次 |
| 最近记录: |