我有一个type T<'a> = N of 'a * T<'a> list
示例声明可能如下:
let td = N("g", [])
let tc = N("c", [N("d", []); N("e", [td])])
我想要做的是声明一个方法来应用一个函数,该函数返回树,其结果是将函数应用于树的节点中的每个值。我已经完成了使用下面的折叠,但是可以不使用吗?
let rec foldTree f e (N(x,t)) =
List.fold (mapFold f) (f e x) t
恢复输出列表顺序的示例用法:
foldTree (fun a x -> x::a) [] tc |> (printf "%A")
哪个FSI输出为
["c"; "d"; "e"; "g"]val it : unit = ()
答案 0 :(得分:2)
如果您还没有通过优秀的Recursive types and folds系列,那么您可能需要仔细阅读它;这将向您展示一组处理自我递归数据结构(例如树类型)的好方法。通过树的一般规则是在这个级别做我需要做的事情,然后递归调用子节点上的当前函数&#34;。在这里,看起来像这样:
let rec treeMap f tree =
match tree with
| N (data, children) ->
N (f data, children |> List.map (treeMap f))
请注意这实际上是如何为您提供与您开始时相同的树结构,而不是像List.fold
示例那样展平结构。
我希望这很简单,不需要太长的解释即可清楚,但如果您在理解此代码的工作原理时遇到任何问题,请告诉我,我会尝试进一步解释。