gpt4 book ai didi

haskell - ApplicativeDo 语言扩展 `Parsing` applicative 仍在寻找 Monad 实例

转载 作者:行者123 更新时间:2023-12-04 01:58:39 25 4
gpt4 key购买 nike

我正在尝试使用 parsers 编写解析器package使用 do句法。这是一个例子:

{-# LANGUAGE ApplicativeDo #-}
import Text.Parser.Char (string, spaces)
import Text.Parser.Token (TokenParsing, natural)

issueParser :: TokenParsing p => p Integer
issueParser = do
spaces
string "**Issue:**"
spaces
string "https://github.com" <|> string "github.com"
string "/commercialhaskell/stack/issues/"
natural

GHC 给我的错误是 Could not deduce (Monad p) arising from a do statement from the context: TokenParsing p .此错误消息是正确的 TokenParsing不提供 Monad作为一个父类(super class),但它确实提供了 Applicative这意味着因为我打开了这个语言扩展,我应该可以使用 do只有 Applicative 的语法.我在这里做错了什么/错过了什么?

最佳答案

弄清楚了。要让这个示例在 ghc 8.0.2 上运行,您需要添加下划线生成器,如下所示:

{-# LANGUAGE ApplicativeDo #-}
import Text.Parser.Char (string, spaces)
import Text.Parser.Token (TokenParsing, natural)

issueParser :: TokenParsing p => p Integer
issueParser = do
_ <- spaces
_ <- string "**Issue:**"
_ <- spaces
_ <- string "https://github.com" <|> string "github.com"
_ <- string "/commercialhaskell/stack/issues/"
n <- natural
pure n

这里已经有一个 ghc 错误来解决这个问题: https://ghc.haskell.org/trac/ghc/ticket/12666

关于haskell - ApplicativeDo 语言扩展 `Parsing` applicative 仍在寻找 Monad 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42285105/

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