【发布时间】:2020-03-03 11:45:55
【问题描述】:
我想在 Elm 中将树枝从一棵树移到另一棵树。
例如:
树 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,但如果有人推荐,我可以使用其他库。
【问题讨论】:
-
请把完整的代码贴在这里,包括数据类型的定义和你所有的函数
-
@Bergi 我已经完成了代码。
-
“没有做我想做的事”不是对问题的非常有用的描述。代码有什么作用?等效的 python 代码会是什么样子,Canopy 中具体缺少什么才能做到这一点?给我们一点帮助以了解问题,那么我们更有可能为您提供帮助。
-
@glennsl 这就是它的作用:ellie-app.com/78tWMPxVPrca1
标签: for-loop recursion functional-programming tree elm