F#将函数应用于列表树的每个节点中的值

时间:2017-05-20 11:01:11

标签: f#

我有一个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 = ()

1 个答案:

答案 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示例那样展平结构。

我希望这很简单,不需要太长的解释即可清楚,但如果您在理解此代码的工作原理时遇到任何问题,请告诉我,我会尝试进一步解释。