gpt4 book ai didi

haskell - 从 monad 翻译为 applicative

转载 作者:行者123 更新时间:2023-12-02 00:06:56 26 4
gpt4 key购买 nike

好的,所以我知道 Applicative 类型类包含什么,以及为什么它有用。但我无法完全理解如何在一个重要的示例中使用它。

例如,考虑以下相当简单的 Parsec 解析器:

integer :: Parser Integer
integer = do
many1 space
ds <- many1 digit
return $ read ds

现在如果不使用 ParserMonad 实例,你到底要怎么写呢?很多人声称这是可以做到的,而且是个好主意,但我不知道到底是怎么做的。

最佳答案

我会写

integer :: Parser Integer
integer = read <$ many1 space <*> many1 digit

有一堆左关联(如应用程序)解析器构建运算符 <$> , <*> , <$ , <* 。最左边的东西应该是纯函数,它将组件值组合成结果值。每个运算符右侧的东西应该是一个解析器,从左到右共同给出语法的组成部分。使用哪个运算符取决于两个选择,如下所示。

  the thing to the right is    signal  / noise
_________________________
the thing to the left is \
+-------------------
pure / | <$> <$
a parser | <*> <*

所以,选择了read :: String -> Integer作为将传递解析器语义的纯函数,我们可以将前导空格分类为“噪声”,将一堆数字分类为“信号”,因此

 read <$ many1 space <*> many1 digit
(..) (.........) (.........)
pure noise parser |
(.................) |
parser signal parser
(.................................)
parser

您可以将多种可能性结合起来

p1 <|> ... <|> pn

并表示不可能

empty

很少需要在解析器中命名组件,并且生成的代码看起来更像是添加了语义的语法。

关于haskell - 从 monad 翻译为 applicative,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15123552/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com