【发布时间】:2014-11-18 02:12:04
【问题描述】:
浏览 Haskell 的文档对我来说总是有点痛苦,因为您获得的有关函数的所有信息通常只是:f a -> f [a],这可能意味着任何数量的东西。
与<|> 函数一样。
我得到的只是:(<|>) :: f a -> f a -> f a,这是一个 “关联二元运算”...
在检查 Control.Applicative 后,我了解到它会根据实施情况做一些看似无关的事情。
instance Alternative Maybe where
empty = Nothing
Nothing <|> r = r
l <|> _ = l
好的,所以如果没有左则返回右,否则返回左,明白了。这让我相信这是一个“左或右”运算符,考虑到它使用| 和@,这有点道理987654328@ 历史上用作“或”
instance Alternative [] where
empty = []
(<|>) = (++)
除了这里它只是调用列表的连接运算符...打破我的想法...
那么这个函数到底是什么?它有什么用?它在宏伟的计划中处于什么位置?
【问题讨论】:
-
对于诸如
<|>之类的极其通用的操作只需要很少的内容。 “理解”它们的正确方法是理解具体实例。即,如果您想在Maybe上使用<|>,那么请了解它对Maybe的作用... -
嗯,这是
Monoid的<>操作,它在a中是多态的。 -
列表实例是因为将列表解释为元素的非确定性选择。如果您阅读
<|>的意思是“orelse”,那么对于两个非确定性列表,您会从其中一个获得非确定性的可能性,因此(++)。 -
啊,但这就是您需要了解的全部内容。与一个单元的关联二元运算是一个幺半群。 List monoid 以空列表为单位,
(++)为关联二元运算。 -
@SassaNF 但是您可以为列表创建至少两个完全不同的应用程序和替代实例,例如 ZipList。见this question。
标签: haskell applicative alternative-functor