我已经定义了树的类型。
data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Read , Eq, Ord, Show)
现在,在文本文件中,我有二叉树,例如:
(7 (3 (1 () ()) (5 () ())) (11 (9 () ()) (13 () ())))
如何编写一个读取树的表示形式并构造Tree类型树的函数?
答案 0 :(得分:0)
让我给你一些提示:
树是一种自相似的结构。听起来你应该使用......
()
代表树Empty
树的表示具有此结构(string_data_with_type_a string_tree string_another_tree)
。似乎这两个括号可以省略,空格分隔这三个参数。
就是这样。哈克勒,祝你旅途愉快。
如果你问我可以给你回答。
答案 1 :(得分:0)
您正在编写解析函数。基本类型类似String -> Tree Int
,但有一些值得考虑的强大改进。
首先,并非所有String
实际上都可以转换为Tree
s(即")"
绝对不是树)所以最好将函数细化为类似{的类型的函数{1}},String -> Maybe (Tree Int)
monad表示可能失败。
其次,您可能并不想真正重新发明Maybe
解析器。您可以使用Int
类型类来访问解析器集合。所以你可能
Read
Read a => String -> Maybe (Tree a)
模块以访问Safe
readMay :: Read a => String -> Maybe a
解析组件。第三,Tree
s是高度递归的,你的括号Lispy语法是高度递归的,你的解析器也应该是。为此,请专注于解析单个节点Tree
,然后根据需要递归解析内部节点。
最后,您可能希望最终考虑一些更强大的解析工具。 "(...)"
比Parsec
类强大得多,并且可以从更小,更简单的部分构建更复杂的递归解析器。