二叉树Haskell

时间:2013-11-06 23:07:50

标签: haskell tree

所以我有这个数据结构:

 class ordering a where

    order :: a-> Int

我想创建一个搜索树,其中每个节点都是一个元素列表,由它们自己的订单号指定(root为1,左子树的根为2,右子树的根为3,依此类推。 )。插入树中的每种类型的数据都有一个与它关联的“顺序”号,它只对“树插入目的”有用,如果它等于1,它将保留在根目录中,如果它是2,则它保持不变在树的左侧,依此类推..

这是我对此的尝试:

data Tree a = EmptyTree
        | Node a order a (Tree [a]) (Tree [a]) deriving (Show, Read, Eq) 

我做了什么,对我有意义,但显然是错的,但说实话,我不明白为什么......

我是Haskell的新手,我一直在努力学习这门语言,所以我感谢你们的任何帮助!

2 个答案:

答案 0 :(得分:1)

您定义的ordering是类型类,而不是数据结构。 order是一个操作,而不是一个类型。将order操作放在Tree数据结构中是没有意义的。

您还没有向我们展示任何实际插入数据的代码,所以我不确定这是如何工作的。

答案 1 :(得分:1)

让我们从实际的功能开始吧。显然你想要这个:

insert :: Ord key => (key,val) -> Tree key val -> Tree key val

由于您的树带有根据键插入的值,因此Tree类型必须包含这两个值:

data Ord key => Tree key val = EmptyTree 
                             | Node key val (Tree key val) (Tree key val)

现在很容易实现insert功能。类型Tree key val的每个树都可以携带key类型的密钥和val类型的值。为了适应一棵树中的各种具体值类型,您可以使用标记的联合类型:

data Myval = My_c1 | My_c2 | MyInt Int | MyInts [Int] | MyString String | ...

现在一个类型的树,例如Tree Int Myval将携带用Myval构造函数标记的值,根据用户提供的Int键插入。

如果您的意思是每种数据类型都有自己的密钥,

ordkey :: Myval -> Int
ordkey My_c1 = 1
ordkey My_c2 = 2
ordkey (MyInt _) = 3
....

然后你不会直接使用insert,而是通过中间人

ordinsert val tree = insert (ordkey val,val) tree

这当然是一种简单,简单的方法,也许这就是你的意思。