在Haskell中使用二叉树 - 尝试使用路径

时间:2018-03-21 19:46:35

标签: list haskell binary-tree branch

我正在努力解决这个问题,所以基本上二叉树可以用作数据库。这里,树的叶子是ND表示没有数据,或者数据d,其中d是数据项。

data Btree a = ND | Data a | Branch (Btree a) (Btree a)

data Dir = L | R

type Path = [Dir]

因此,可以通过给出诸如[L,R,L]之类的列表来给出叶子的路径 表示通过从树根移动左,右,左移动到达的叶子(可能没有这样的叶子)。

我要做的是例如定义一些名为提取哪里

extract :: Path  -> Btree a -> Error a

给定路径和二叉树,在路径末尾输出数据,并在路径与任何数据不匹配时给出错误值。任何帮助将不胜感激

1 个答案:

答案 0 :(得分:3)

这可能有助于您开始了解需要处理的案例。你有两个参数,每个参数都有少量的构造函数:

  1. Path参数可以为空([])或不是(_:_)。
  2. Btree a参数可以为空(ND),有数据(Data _),或者是内部节点(Branch _ _)。
  3. 此外,返回值不是总是错误;它可以是a类型的值!您可能想到的返回值类似于Either e a(其中e是您的错误类型,通常为String,但它可能是类似Dir类型的枚举类型如果你只是想用Maybe a发出“没有找到数据”的信号,甚至Nothing

    考虑到这一点,你有6个案例应该定义你的函数:

    extract :: Path -> Btree a -> Maybe a
    extract [] ND = ...
    extract [] (Data d) = ...
    extract [] (Branch left right) = ...
    extract (d:ds) ND = ...
    extract (d:ds) (Data dat) = ...
    extract (d:ds) (Branch left right) = ...
    

    现在您有六个更简单的函数来定义。有些很容易,有些则不那么容易,但是这应该可以让你在某个地方开始,或者至少可以改进你所要求的内容。