所以我有这个数据结构:
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的新手,我一直在努力学习这门语言,所以我感谢你们的任何帮助!
答案 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
这当然是一种简单,简单的方法,也许这就是你的意思。