我正在努力解决这个问题,所以基本上二叉树可以用作数据库。这里,树的叶子是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
给定路径和二叉树,在路径末尾输出数据,并在路径与任何数据不匹配时给出错误值。任何帮助将不胜感激
答案 0 :(得分:3)
这可能有助于您开始了解需要处理的案例。你有两个参数,每个参数都有少量的构造函数:
Path
参数可以为空([]
)或不是(_:_
)。Btree a
参数可以为空(ND
),有数据(Data _
),或者是内部节点(Branch _ _
)。此外,返回值不是总是错误;它可以是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) = ...
现在您有六个更简单的函数来定义。有些很容易,有些则不那么容易,但是这应该可以让你在某个地方开始,或者至少可以改进你所要求的内容。