gpt4 book ai didi

haskell - s-expr 打印函数中的错误

转载 作者:太空宇宙 更新时间:2023-11-03 18:47:45 25 4
gpt4 key购买 nike

为了练习我的 Haskell 技能,我正在关注 Write Yourself a Scheme教程。我已经为 s 表达式实现了一个解析器,但我在打印函数方面遇到了问题。

当我运行下面的程序时

main :: IO ()
main = do args <- getArgs
putStrLn $ readExpr (args !! 0)

它正确地解析了 s 表达式,但是当我定义我自己的 shows 而不是 deriving 它时,我得到嵌套列表和向量内列表的错误输出:

$ ./parser "(1 (2) 3)"
(1 (2 3))
$ ./parser "#(1 (2) 3)"
#(1 (2 3))
$ ./parser "(1 (2 (3)) 4)"
(1 (2 (3 4)))
$ ./parser "(1 (2 (3)) (4))"
(1 (2 (3 (4))))

不过,其他情况和嵌套向量工作正常:

lars@zygmunt:~/src/scm48$ ./parser "(1 #(2) 3)"
(1 #(2) 3)
lars@zygmunt:~/src/scm48$ ./parser "#(1 #(2) 3)"
#(1 #(2) 3)
lars@zygmunt:~/src/scm48$ ./parser "(1 (2 3))"
(1 (2 3))

我已经更改了 LispVal 的表示以包含 NilPair 构造函数,而不是 ListDottedList,因为它们与 Scheme 数据模型更匹配。打印列表由

showsVal :: Value -> ShowS
showsVal Nil = ("()" ++)
showsVal (Pair x y) = ("(" ++) . showsPair x y . (++ ")")
showsVal (String s) = shows s
showsVal (Symbol n) = (n ++)
showsVal (Number x) = shows x
showsVal (Boolean True) = ("#t" ++)
showsVal (Boolean False) = ("#f" ++)
showsVal (Vector v) = ("#(" ++) . showsVec v . (")" ++)

showsPair x Nil = showsVal x
showsPair x (Pair y z) = (showsVal x) . (" " ++) . showsPair y z
showsPair x y = (showsVal x) . (" . " ++) . (showsVal y)

showsVec [] = id
showsVec [x] = shows x
showsVec (x:xs) = shows x . (" " ++) . showsVec xs

我怀疑错误出在 showsPair 中,但我就是想不通。

最佳答案

我发现自己:

showsVal (Pair x y)  =  ("(" ++) . showsPair x y . (++ ")")

应该是

showsVal (Pair x y)  =  ("(" ++) . showsPair x y . (")" ++)
-- ^^^^^^

关于haskell - s-expr 打印函数中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5261213/

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