Ошибка в функции печати s-expr
Чтобы отработать свои навыки в Haskell, я следую учебному пособию " Напиши себе схему". Я реализовал парсер для 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
включать Nil
а также Pair
конструкторы вместо List
а также DottedList
, так как они лучше соответствуют модели данных 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
, но я просто не могу понять это.
1 ответ
Решение
Я узнал сам:
showsVal (Pair x y) = ("(" ++) . showsPair x y . (++ ")")
должно было
showsVal (Pair x y) = ("(" ++) . showsPair x y . (")" ++)
-- ^^^^^^