- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚开始使用 Parsec(在 Haskell 方面经验很少),我对使用 monads 或 applicatives 有点困惑。阅读“Real World Haskell”、“Write You a Haskell”后,我的总体感觉是应用程序是首选,但我真的不知道。
所以我的问题是:
最佳答案
可能值得关注 Applicative
之间的关键语义差异。和 Monad
, 以确定何时适合。比较类型:
(<*>) :: m (s -> t) -> m s -> m t
(>>=) :: m s -> (s -> m t) -> m t
<*>
,您选择两种计算,一种是函数,另一种是参数,然后它们的值由应用程序组合。部署
>>=
,你选择一个计算,并解释你将如何利用它的结果值来选择下一个计算。这是“批处理模式”和“交互”操作的区别。
Applicative
(扩展失败并选择给出
Alternative
)捕获语法的上下文无关方面。您将需要
Monad
的额外力量仅当您需要从输入的一部分检查解析树以决定应将哪种语法用于输入的另一部分时才为您提供。例如,您可能会读取格式描述符,然后读取该格式的输入。尽量减少对 monad 额外功能的使用会告诉您哪些值依赖是必不可少的。
>>=
的想法只有基本的值(value)依赖才能让您清楚地了解分散负载的机会。当两个计算与
<*>
结合时,两者都不需要等待另一个。 Applicative-when-you-can-but-monadic-when-you-must 是速度的公式。
ApplicativeDo
的点是自动对以单子(monad)样式编写的代码进行依赖性分析,从而意外地过度序列化。
ApplicativeDo
是一种让您没有时间重构的以单子(monad)风格编写的程序更具应用性(在某些情况下意味着更快)的好方法。但除此之外,我认为 applicative-when-you-can-but-monadic-when-you-must 也是了解正在发生的事情的更好方法。
关于haskell - Parsec:应用程序与 Monads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38707813/
Haskell Parsec 的 indents 包提供了一种解析缩进式语言(如 Haskell 和 Python)的方法。它重新定义了 Parser类型,那么如何使用 Parsec 的 Text.P
我有一个用 Text 编写的解析器作为流类型,而默认为 Text.Parsec.String模块使用 String除此以外。 如何在 Parsec Text b c 的上下文中使用自定义编写的解析器
Text Text.Parsec Text.Parsec.ByteString Text.Parsec.ByteString.Lazy
我在弄清楚如何使用 Text.Parsec.Indent 中的任何功能时遇到问题 indents 提供的模块Haskell 的包,它是 Parsec 的一种附加组件。 所有这些功能有什么作用?它们将如
Text Text.Parsec Text.Parsec.ByteString Text.Parsec.ByteString.Lazy
我目前正在尝试使用现实世界 Haskell 中提供的完整 CSV 解析器。为了我尝试修改代码以使用 ByteString 而不是 String,但是有一个 string 组合器仅适用于 字符串。 是否
我正在尝试解析嵌套的类 C block 注释 import Text.ParserCombinators.Parsec import Control.Monad (liftM) flat :: Mon
如果违反语义规则,使用 Parsec 如何在特定位置指示错误。我知道通常我们不想做这样的事情,但考虑一下示例语法。 ::= | ... ::= a positive integer power
我目前正在尝试使用 Parsec 在 Haskell 中设计一个解析器。声明类型的语法应如下所示: Fruit is a Apple 类型也应该能够有参数: Fruit a b is a Apple
我写了这样的排列解析例子: data Entry = Entry { first_name :: String , last_name :: String , date_of_birt
我正在尝试解析(目前)Dot 语言的一个子集。 语法是here我的代码如下 import System.Environment import System.IO import qualified Te
我有一个列表,我需要解析除最后一个元素之外的所有元素都需要由一个解析器解析,最后一个元素需要由另一个解析器解析。 a = "p1 p1b ... p2" or a = "p2" 原来我试过 parse
我需要为一种编程语言创建一个解析器。到目前为止,它已经完成了 95%,我想说,除了一个小细节。 用这种语言编写的程序具有以下结构: outputs inputs expressions 要求是输出不能
在我的工作中,我遇到了很多粗糙的 sql,我有一个聪明的想法,那就是编写一个程序来解析 sql 并整齐地打印出来。我很快就完成了大部分工作,但遇到了一个我不知道如何解决的问题。 所以让我们假设 sql
我正在编写一种使用 Parsec 进行解析的编程语言。为了报告错误消息,我使用 getPosition 将语法树的每个元素都标记了其源位置。函数来自 the Pos module 秒差距。 但是,它只
我正在尝试使用 parsec 解析如下表达式: f a b c => (Appl (Appl (Appl f a) b) c) 我尝试使用以下内容: appl :: Parser Expr appl
是否有可能以某种方式获得某些自定义类型的解析错误?例如,从错误中获取更多关于解析上下文的信息会很酷。而且仅以短信的形式提供错误信息似乎不太方便。 最佳答案 正如 Rhymoid 所观察到的,不幸的是,
我对 Parsec 的一个常见问题是,如果无效输入出现在“正确”的位置,它往往会忽略它。 作为一个具体的例子,假设我们有 integer :: Parser Int ,我写 expression =
我正在使用 Parsec 解析表达式,并且我想使用 Parsec 中的用户状态来跟踪这些表达式中的变量。不幸的是,我真的不知道该怎么做。 给定以下代码: import Data.Set as Set
我正在尝试编写一个 Haksell Parsec Parser,它将文件中的输入数据解析为 LogLine 数据类型,如下所示: --Final parser that holds the indvi
我是一名优秀的程序员,十分优秀!