haskell - Haskell 的 <|> 运算符有什么作用?

标签 haskell applicative alternative-functor

浏览 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 <|> ba 的“选择”或bab并行完成。但让我们备份一下。

确实,像(<*>)这样的类型类中的操作没有实际意义。或(<|>) 。这些操作通过两种方式赋予意义:(1)通过法则和(2)通过实例化。如果我们不是在谈论 Alternative特定实例那么只有(1)可用于直觉意义。

所以“关联”意味着 a <|> (b <|> c)(a <|> b) <|> c 相同。这很有用,因为它意味着我们只关心与 (<|>) 链接在一起的事物的序列 ,而不是他们的“树结构”。

其他法律包括 empty 的身份。特别是a <|> empty = empty <|> a = a 。根据我们对“选择”或“并行”的直觉,这些定律解读为“一个或(不可能的事情)必须是一个”或“旁边(空过程)只是一个”。它表明emptyAlternative 的某种“故障模式” .

还有其他法律规定如何 (<|>)/emptyfmap 互动(来自Functor)或pure/(<*>) (来自 Applicative ),但这也许是理解 (<|>) 含义的最佳方式是检查实例化 Alternative 的类型的一个非常常见的示例:一个Parser .

如果x :: Parser Ay :: Parser B然后(,) <$> x <*> y :: Parser (A, B)解析x 然后 y按顺序。相比之下,(fmap Left x) <|> (fmap Right y)解析或者 xy ,以 x 开头,尝试两种可能的解析。换句话说,它表示解析树中的一个分支、一个选择或一个并行解析宇宙。

关于haskell - Haskell 的 <|> 运算符有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26002415/

相关文章:

compiler-construction - 是否有使用严格求值的 Haskell 编译器或预处理器?

haskell - Haskell 中的半独立 Action

haskell - 使用 zip 部分应用 <*>

regex - 使用 Applicative Functor 匹配至少 3 个 Scala 正则表达式中的 1 个

parsing - 应用解析器陷入无限循环

javascript - LazyEvaluation 的性能优势究竟从何而来?

networking - 编写示例服务器应用程序 - forkIO 是不可避免的吗?

用于条件/替代的推测执行的 Haskell 策略

haskell - 为什么 Parsec 不使用 Control.Applicative 运算符

haskell - 如何使用应用程序链接任意长度的原子解析器系列?