从 monad 翻译为 applicative

2024-07-04

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

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

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

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


我会写

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 monad 翻译为 applicative 的相关文章

  • 我可以在程序内更改堆栈大小限制吗?

    我可以通过传递配置 GHC 编译的 Haskell 程序的最大堆栈大小 RTS Kn到它 在哪里n是某个数字 有没有办法在程序内更改此设置 我想对各种函数的堆栈消耗进行基准测试 因此尝试在各种限制下运行它 捕获StackOverflow例外
  • Python 的“with”是一元吗?

    像我之前的许多鲁莽的先驱者一样 我正在努力穿越理解单子这片无路可走的荒原 我仍然在蹒跚学步 但我不禁注意到 Python 的某种类似 monad 的品质with陈述 考虑这个片段 with open input filename r as
  • 记录语法和求和类型

    我有关于 Haskell 中的总和类型的问题 我想创建一个由两个或多个其他类型组成的总和类型 并且每个类型可能包含多个字段 一个简单的例子是这样的 data T3 T1 a Int b Float T2 x Char deriving Sh
  • 在 Haskell 中使用 Maybe 类型

    我正在尝试利用 Haskell 中的 Maybe 类型 我有一个查找返回 Maybe 的键 值元组 如何访问 Maybe 包装的数据 例如 我想将 Maybe 包含的整数与另一个整数相加 或者 您可以进行模式匹配 case maybeVal
  • 不明确的类型变量

    相关我之前关于遍历数据结构的问题 https stackoverflow com questions 1855371 avoiding boilerplate when dealing with many unrelated types 当
  • 当 Haskell 持久库中需要“Key”时,如何通过“Int”获取实体?

    我将持久性 orm 与 scotty Web 框架一起使用 我想通过 id 从 db 获取值 这些是来自 GET 请求的 有 get 函数接受 Key Entity 变量并返回 Maybe Entity 我使用以下代码从数据库获取值 k l
  • Haskell 中的随机枢轴快速排序

    是否有可能在 Haskell 中实现快速排序 使用 RANDOM PIVOT 但仍然有一个简单的Ord a gt a gt a 签名 我开始了解 Monad 目前 我将 monad 解释为某种 命令模式 这对于 IO 非常有用 所以 我知道
  • Haskell - 让函数返回空字符

    我正在尝试创建一个函数来删除字符串中的每个第 n 个元素 dropEvery String gt Int gt String dropEvery str n map char indx gt if indx mod n 0 then cha
  • 数据记录的类约束

    我有一个data type data BuildException a KillBuild JobID a Stage FailBuild JobID a Stage CancelBuild JobID a Stage StopBuild
  • Haskell 乘加运算的数学性能

    我正在用 Haskell 编写一个游戏 我当前在 UI 上的传递涉及大量几何图形的程序生成 我目前专注于识别一项特定操作的性能 C ish 伪代码 Vec4f multiplier addend Vec4f vecList for int
  • Java 中更高级的泛型

    假设我有以下课程 public class FixExpr Expr
  • Haskell 中将函数与类型关联起来

    假设您有一个序列化器 反序列化器类型类 class SerDes a where ser a gt ByteString des ByteString gt a 事实证明 为每种类型提供一个特殊的辅助函数至关重要a e g compress
  • 对于 Haskell 的 QuickCheck,什么是收缩?

    我正在学习 QuickCheck gt 2 6 的诀窍 但我不明白什么是心理医生 从看类型签名 http hackage haskell org packages archive QuickCheck 2 6 doc html Test Q
  • 不明确的类型和重载数字运算的默认值

    import Data Dynamic default Integer Double a Num a gt a a 5 show Show a gt a gt String toDyn Typeable a gt a gt Dynamic
  • Haskell:打印文本编码

    Haskell 新手在这里 ghc version The Glorious Glasgow Haskell Compilation System version 6 12 1 在尝试调试第三方 Haskell 程序中与区域设置相关的奇怪错
  • 取决于台架测试

    我有一个测试项目 test suite spec benchmark bench build depends library test spec 我如何依赖基准测试中的测试套件代码 上面的方法不起作用 因为带有 name 的包library
  • 在 Haskell 和 C 之间交换结构化数据

    首先 我是 Haskell 初学者 我计划将 Haskell 集成到 C 中以实现实时游戏 Haskell 负责逻辑 C 负责渲染 为此 我必须在每个周期 每秒至少 30 次 相互之间传递大量复杂的结构化数据 游戏状态 所以传递的数据应该是
  • Haskell 中的精确流量控制

    The Idea 你好 我正在尝试在 Haskell 中实现一个基于数据流思想的图像处理库 我遇到了一个与如何处理控制流相关的问题 主要思想是引入一个time The time is a Float 可以在代码中的任何位置访问它 您可以将其
  • 更新列表的第 'x' 个元素 - Haskell [重复]

    这个问题在这里已经有答案了 可能的重复 替换 Haskell 中的单个列表元素 https stackoverflow com questions 5852722 replace individual list elements in ha
  • Haskell Stack 构建特定的可执行文件

    如何构建特定的堆栈可执行文件 即 那些指定的projectname cabal like executable executable name hs source dirs tools main is ExecutableModule hs

随机推荐