我在Graham Hutton的Haskell编程的第8章中,我正在复制代码并在GHC中测试它。“Haskell编程”错误sat函数
查看幻灯片浏览: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
以免它与Prelude return
函数冲突。
错误在最后一个函数sat
。我从书中直接复制了这些内容。
正如你可能会看到p
是从Char
到Bool
(例如isDigit
)和x
功能是[(Char, String)]
型的,所以这是第一个错误。
然后pih_return
取值v
并返回[(v, inp)]
其中inp
是String
。这会导致sat
中的错误,因为v
通过的是x
而不是Char
。
我想出了这个解决方案,通过明确包括inp
到sat
这是解决问题的最佳方法是什么?
该幻灯片中的幻灯片11指向完整的图书馆版本,下面@RüdigerHanke给出了链接。事实上,幻灯片并没有说明幻灯片11之前的所有代码只是第一个版本,幻灯片11之后的所有代码都是用于库文件中的Monadic版本。 – MtnViewMark 2010-04-09 15:11:25
啊。谢谢,MntViewMark。这解释了事情。这本书在书中也没有被恰当地提及,只是在本章末尾的评论中他说:“由于涉及解析器一元性质的技术原因,图书馆中的一些基本定义与那些基本定义略有不同在这里给出“。 – 2010-04-09 15:25:05