Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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_Tree - Fatal编程技术网

Haskell 从树中删除节点并返回结果林

Haskell 从树中删除节点并返回结果林,haskell,tree,Haskell,Tree,我来自Java背景,想学习一些Haskell。不过,现在有点卡住了 我想做的是:我有一个树列表,其中每个节点在列表中的所有树上都有一个唯一的标识符。现在我想从这些树中删除一个节点,并返回新树和未更改的树 删除节点应: 使所述节点的所有子节点成为新树的根 删除已删除节点(包括根节点)的父节点,并对所有已删除节点执行上述操作 想象一下下面的树: 删除节点“2”时,我希望结果为以下树: 树中的每个节点都由标识符和子树列表组成。 到目前为止,我所掌握的就是这些,但它显然不起作用,我对如何用Has

我来自Java背景,想学习一些Haskell。不过,现在有点卡住了

我想做的是:我有一个树列表,其中每个节点在列表中的所有树上都有一个唯一的标识符。现在我想从这些树中删除一个节点,并返回新树和未更改的树

删除节点应:

  • 使所述节点的所有子节点成为新树的根
  • 删除已删除节点(包括根节点)的父节点,并对所有已删除节点执行上述操作
想象一下下面的树:

删除节点“2”时,我希望结果为以下树:

树中的每个节点都由标识符和子树列表组成。 到目前为止,我所掌握的就是这些,但它显然不起作用,我对如何用Haskell解决这个问题有点茫然:

import Data.Tree
data CustomNode = CustomNode { identifier :: Int } deriving (Ord,Eq,Show,Read)
type CustomTree = Tree CustomNode

myTree0 = t0
    where
        leaf i = Node CustomNode{identifier = i} []
        t0 = Node CustomNode{identifier = 0} [t1]
        t1 = Node CustomNode{identifier = 1} [t2, t5]
        t2 = Node CustomNode{identifier = 2} [leaf 3, leaf 4] 
        t5 = Node CustomNode{identifier = 5} [leaf 6]

myTree1 = t0
    where
        leaf i = Node CustomNode{identifier = i} []
        t0 = Node CustomNode{identifier = 7} [leaf 8]

deleteNode :: Int -> [CustomTree] -> [CustomTree]
deleteNode _ [] = []
deleteNode n (x:xs) = if isNodeInTree n x then deleteNodeFromTree n x ++ xs else deleteNode n xs
--below is the fixed line as per the answer below
--deleteNode n (x:xs) = if isNodeInTree n x then deleteNodeFromTree n x ++ xs else x : deleteNode n xs

deleteNodeFromTree :: Int -> CustomTree -> [CustomTree]
deleteNodeFromTree n (Node c xs) = if identifier c == n then [] else deleteNode n xs
--below is the fixed line as per the answer below
--deleteNodeFromTree n (Node c xs) = if identifier c == n then xs else deleteNode n xs

isNodeInTree :: Int -> CustomTree -> Bool
isNodeInTree n (Node c xs) = if identifier c == n then True else isNodeInForest n xs

isNodeInForest :: Int -> [CustomTree] -> Bool
isNodeInForest n [] = False
isNodeInForest n (x:xs) = if isNodeInTree n x then True else isNodeInForest n xs

任何帮助都将不胜感激

看来你在这里已经有了一个合理的开始

我假设您希望
deleteNode
获取一个林并返回同一个林,但删除指定的节点。那么,

if isNodeInTree n x then ... else deleteNode n xs
你刚刚扔掉了
x
。你可能不是故意的

... else x : deleteNode n xs
我会把那棵树留在森林里,这可能是你想要的

此外,在
deleteNodeFromTree
中:

if identifier c == n then [] ...
也许您想在此时返回节点的所有子节点?(因此它们都成为根节点。)


这些是我唯一能突出的东西。看看这会带你去哪里…

@MathematicalOrchid是的。对不起,我忘了添加导入。令人惊讶的是,这两件东西是我所缺少的所有东西!我想这会是更多的工作!非常感谢,哈斯克尔实际上非常棒:)@Marco Happy Haskling.。-)