Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Haskell中删除树的根_Haskell - Fatal编程技术网

如何在Haskell中删除树的根

如何在Haskell中删除树的根,haskell,Haskell,我有一棵二叉树。我们如何删除树的顶部(根)?我有一个名为treeTop的函数,它返回树的顶部,但是如何删除它? 那是我的树: data Tree a = Empty | Leaf a | Node a (Tree a) (Tree a) String deriving (Show) 假设这不是一棵平衡树,那么 deleteRoot :: Tree -> Maybe Tree deleteRoot (Node _ l r _) = Just $ append l r deleteRo

我有一棵二叉树。我们如何删除树的顶部(根)?我有一个名为treeTop的函数,它返回树的顶部,但是如何删除它? 那是我的树:

data Tree a = Empty
| Leaf a
| Node a (Tree a) (Tree a) String
deriving (Show)

假设这不是一棵平衡树,那么

 deleteRoot :: Tree -> Maybe Tree
 deleteRoot (Node _ l r _) = Just $ append l r
 deleteRoot _            = Nothing
其中,
append
以树为单位,并将其粘贴到另一棵树的末端,实现这一点相当机械

 append :: Tree -> Tree -> Tree
 append Empty r    = r
 append (Leaf a) r = <???>
 append (Node v l r s) r' = Node v l (append r r') s
进入

其中
0
表示
为空
。请注意,原始树未被修改,因此如果我们启动GHCi

 Main*> let test = Node () (Node () Empty Empty "bar") (Node () Empty Empty "baz") "foo"
 Main*> deleteRoot test
   Node Empty (Node Empty Empty "baz") "bar"
 Main*> test
   Node (Node () Empty Empty "bar") (Node () Empty Empty "baz") "foo"
所以它不会修改旧文本,但函数式语言就是这样工作的,我们保留旧数据并创建新的不变值,而不是破坏旧数据

我的最终代码是

data Tree a = Empty
            | Leaf a
            | Node a (Tree a) (Tree a) String
            deriving (Show)

deleteRoot :: Tree a -> Maybe (Tree a)
deleteRoot (Node _ l r _) = Just $ append l r
deleteRoot _            = Nothing

append :: Tree a -> Tree a -> Tree a
append Empty r = r
append (Leaf a) r  = Node a Empty r ""
append (Node v l r s) r' = Node v l (append r r') s

“删除树顶”是什么意思?请记住,在Haskell中,数据结构是不可变的,因此实际上您将返回一个全新的树,而不是破坏性地修改旧的树。通过删除顶部,我的意思是:例如,这是一棵树(节点5(节点7(叶9)(叶10))(叶15)),我们必须删除5,并将其替换为左或右子树。因此,你根本不是说“删除根”;你的意思是“如何返回子树”?它看起来很完美。谢谢,但它在deleteRoot Empty=Nothing行显示了一个错误。错误是“输入“=”的解析错误。我已更新以修复一些错误,但我没有得到该解析错误,请检查并确保缩进正确:)@user305163您的示例中有一个标识错误,您必须缩进构造函数以内联
Empty
@user305163我已用最终代码更新,看一看,这一次仍然给了我一个解析错误,在imput u的deleteRoot行(Node l r u)=Just$append l rI我无法复制这个错误,你是如何运行的?
 Main*> let test = Node () (Node () Empty Empty "bar") (Node () Empty Empty "baz") "foo"
 Main*> deleteRoot test
   Node Empty (Node Empty Empty "baz") "bar"
 Main*> test
   Node (Node () Empty Empty "bar") (Node () Empty Empty "baz") "foo"
data Tree a = Empty
            | Leaf a
            | Node a (Tree a) (Tree a) String
            deriving (Show)

deleteRoot :: Tree a -> Maybe (Tree a)
deleteRoot (Node _ l r _) = Just $ append l r
deleteRoot _            = Nothing

append :: Tree a -> Tree a -> Tree a
append Empty r = r
append (Leaf a) r  = Node a Empty r ""
append (Node v l r s) r' = Node v l (append r r') s