浏览 Haskell 的文档对我来说总是有点痛苦,因为你获得的有关函数的所有信息通常只不过是:f a -> f [a]
这可能意味着很多事情。
就像 <|>
的情况一样功能。
我得到的只是:(<|>) :: f a -> f a -> f a
这是一个“关联二元运算”...
经检查Control.Applicative
我了解到它会根据实现情况执行看似无关的事情。
instance Alternative Maybe where
empty = Nothing
Nothing <|> r = r
l <|> _ = l
好吧,如果没有左边,它返回右边,否则它返回左边,明白了..这让我相信它是一个“左或右”运算符,考虑到它使用 |
,这有点有意义。和|
历史上用作“OR”
instance Alternative [] where
empty = []
(<|>) = (++)
除了这里它只是调用列表的串联运算符...打破我的想法...
那么这个函数到底是什么?它有什么用?它在宏伟的计划中处于什么位置?
最佳答案
通常它的意思是“选择”或“并行”a <|> b
是 a
的“选择”或b
或a
和b
并行完成。但让我们备份一下。
确实,像(<*>)
这样的类型类中的操作没有实际意义。或(<|>)
。这些操作通过两种方式赋予意义:(1)通过法则和(2)通过实例化。如果我们不是在谈论 Alternative
的特定实例那么只有(1)可用于直觉意义。
所以“关联”意味着 a <|> (b <|> c)
与 (a <|> b) <|> c
相同。这很有用,因为它意味着我们只关心与 (<|>)
链接在一起的事物的序列 ,而不是他们的“树结构”。
其他法律包括 empty
的身份。特别是a <|> empty = empty <|> a = a
。根据我们对“选择”或“并行”的直觉,这些定律解读为“一个或(不可能的事情)必须是一个”或“旁边(空过程)只是一个”。它表明empty
是 Alternative
的某种“故障模式” .
还有其他法律规定如何 (<|>)
/empty
与 fmap
互动(来自Functor
)或pure
/(<*>)
(来自 Applicative
),但这也许是理解 (<|>)
含义的最佳方式是检查实例化 Alternative
的类型的一个非常常见的示例:一个Parser
.
如果x :: Parser A
和y :: Parser B
然后(,) <$> x <*> y :: Parser (A, B)
解析x
然后 y
按顺序。相比之下,(fmap Left x) <|> (fmap Right y)
解析或者 x
或y
,以 x
开头,尝试两种可能的解析。换句话说,它表示解析树中的一个分支、一个选择或一个并行解析宇宙。
关于haskell - Haskell 的 <|> 运算符有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26002415/