我想在榆树中将树枝从一棵树移到另一棵树。
例如:
树1:
A-1
- A-1-1
- - A-1-1-1
- - A-1-1-2
- - - A-1-1-2-1
- - - A-1-1-2-2
树2
B-1
- B-1-1
- - B-1-1-1
- - B-1-1-2
- - - B-1-1-2-1
- - - B-1-1-2-2
我想将A-1-1移至B-1-1-2-1下,这应该给
B-1
- B-1-1
- - B-1-1-1
- - B-1-1-2
- - - B-1-1-2-1
- - - - A-1-1
- - - - - A-1-1-1
- - - - - A-1-1-2
- - - - - - A-1-1-2-1
- - - - - - A-1-1-2-2
- - - B-1-1-2-2
我是函数编程的新手。我可以想象如何在Python中使用递归forloop来做到这一点,但我陷入了Elm的困境。
我可以轻松移动一个节点,但看不到如何递归添加子节点:
module Main exposing (..)
import Canopy exposing (Node,append,children,leaf,mapChildren,node,value)
import Html exposing (Html,b,div,h1,h2,li,text,ul)
import List exposing (map)
tree1 : Node String
tree1 =
node "A-1"
[ node "A-1-1"
[ leaf "A-1-1-1",node "A-1-1-2"
[ leaf "A-1-1-2-1",leaf "A-1-1-2-2"
]
]
]
tree2 : Node String
tree2 =
node "B-1"
[ node "B-1-1"
[ leaf "B-1-1-1",node "B-1-1-2"
[ leaf "B-1-1-2-1",leaf "B-1-1-2-2"
]
]
]
tree3 : Node String
tree3 =
let
nodeToMove =
"A-1-1"
newParentNode =
"B-1-1-2-1"
-- append the node only but not its descendants
treeWithNewNode =
append newParentNode nodeToMove tree2
-- type mismatch
-- treeWithNewNodeAndNewNodeChildren =
-- nodeToMove |> mapChildren (\child -> append
-- does not do what I was hopping for
-- newTree =
-- mapChildrenAt
-- nodeToMove
-- (\child -> append newParentNode (value child) treeWithNewNode)
-- tree2
newParentNode child tree2)
in
treeWithNewNode
main =
div []
[ h1 [] [ text "Adding a branch to another tree" ],h2 [] [ text "Tree 1" ],viewNode tree1,h2 [] [ text "Tree 2" ],viewNode tree2,h2 [] [ text "Move A-1-1 under B-1-1-2-1" ],viewNode tree3
]
viewNode : Node String -> Html msg
viewNode node =
let
subNodes =
children node
in
li []
[ b [] [ text (value node) ],ul [] (List.map viewNode subNodes)
]
我的审判在这里: https://ellie-app.com/7842F8jCLpCa1
我在这里使用Canopy,但如果推荐的话,我可以使用另一个库。