如何从Haskell中的文件中读取二叉树

时间:2013-02-09 15:04:25

标签: haskell

我已经定义了树的类型。

data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Read , Eq, Ord, Show)

现在,在文本文件中,我有二叉树,例如:

(7 (3 (1 () ()) (5 () ())) (11 (9 () ()) (13 () ())))

如何编写一个读取树的表示形式并构造Tree类型树的函数?

2 个答案:

答案 0 :(得分:0)

让我给你一些提示:

  1. 树是一种自相似的结构。听起来你应该使用......

  2. ()代表树Empty

  3. 树的表示具有此结构(string_data_with_type_a string_tree string_another_tree)。似乎这两个括号可以省略,空格分隔这三个参数。

  4. 就是这样。哈克勒,祝你旅途愉快。

    如果你问我可以给你回答。

答案 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类强大得多,并且可以从更小,更简单的部分构建更复杂的递归解析器。