Functional programming 抓取树中的节点列表?

Functional programming 抓取树中的节点列表?,functional-programming,ocaml,Functional Programming,Ocaml,如何使用ocaml从满足特定条件的树结构中获取节点列表?因为一切都是重新创建的,所以没有保存的数据结构。任何试图返回列表的函数类型在命中节点时只能返回一个元素,而不是列表 这是一种树类型: type tree = Leaf of int | Node of int * tree * tree 下面是一个函数,它返回树节点的所有偶数值: let evens t = let rec go sofar = function | Leaf k -> if k mod 2 = 0

如何使用ocaml从满足特定条件的树结构中获取节点列表?因为一切都是重新创建的,所以没有保存的数据结构。任何试图返回列表的函数类型在命中节点时只能返回一个元素,而不是列表

这是一种树类型:

type tree = Leaf of int | Node of int * tree * tree
下面是一个函数,它返回树节点的所有偶数值:

let evens t =
    let rec go sofar = function
    | Leaf k -> if k mod 2 = 0 then k :: sofar else sofar
    | Node (k, lt, rt) ->
         let sofar' = if k mod 2 = 0 then k :: sofar else sofar in
         let sofar'' = go sofar' lt in
         go sofar'' rt
    in
    go [] t

一个函数可以有多个参数。特别是,您可以使用第二个参数来跟踪到目前为止看到的、希望在最后返回的节点。问题是,如果您分支到多个树中,每个树都有不同的第二个参数,并且无法从根将它们全部连接在一起?例如,当您到达树的叶子时,第二个参数包含所看到的节点,但不能只为每个叶返回该参数,因为所有叶都必须向上返回。所以从根本上讲,您需要积累所有这些,但是ocaml没有这样的数据结构?我不认为列表有效哇,我完全忘记了传递累加器值。谢谢