gpt4 book ai didi

haskell - "Programming In Haskell"sat函数错误

转载 作者:行者123 更新时间:2023-12-03 14:23:38 27 4
gpt4 key购买 nike

我在 Graham Hutton 的 Haskell 编程的第 8 章中,我正在复制代码并在 GHC 中对其进行测试。

在此处查看幻灯片:http://www.cis.syr.edu/~sueo/cis352/chapter8.pdf特别是幻灯片 15

到目前为止我复制的相关代码是:

type Parser a = String -> [(a, String)]
pih_return :: a -> Parser a
pih_return v = \inp -> [(v, inp)]
failure :: Parser a
failure = \inp -> []
item :: Parser Char
item = \inp -> case inp of
[] -> []
(x:xs) -> [(x,xs)]
parse :: Parser a -> String -> [(a, String)]
parse p inp = p inp
sat :: (Char -> Bool) -> Parser Char
sat p = do x <- item
if p x then pih_return x else failure

我已更改 return 的名称函数从书到 pih_return以免与前奏曲 return 发生冲突功能。

错误在最后一个函数中 sat .我直接从书中复制了这个。

正如你可能看到的 p是来自 Char 的函数至 Bool (例如 isDigit )和 x[(Char, String)] 类型,所以这是第一个错误。

然后 pih_return取值 v并返回 [(v, inp)]在哪里 inpString .这会导致 sat 中的错误。因为 v被通过的是 x这不是 Char .

我提出了这个解决方案,明确包括 inp进入 sat
sat :: (Char -> Bool) -> Parser Char
sat p inp = do x <- item inp
if p (fst x) then pih_return (fst x) inp else failure inp

这是解决问题的最佳方法吗?

最佳答案

第一个 sat 不能工作,Parser 必须是 monad 才能使用 do 表示法。为了使其成为 monad 实例,必须使用 newtype

我不拥有这本书,但我想作者想从一个简单的解析器类型开始,然后将它扩展到一个完整的单子(monad),我怀疑你已经将非单子(monad)版本的定义与 Parser 单子(monad)之一混淆了( sat ) 并错过了沿途的 monad 实例声明。

章节中的代码 on the author's web site 已经为 Parser 定义了一个 monad 实例。

如果您必须为简单的 sat 类型编写 Parser 函数,我宁愿以 lambda 样式(如 item )并完全避免使用 monad(您注意到原始 satdo block 是 Parser monad 而你的 0x单子(monad)?)。而且我认为您的 List 版本中有一个错误:而不是 sat ,我认为应该是 pih_return (fst x) inp

关于haskell - "Programming In Haskell"sat函数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2607498/

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