鉴于此树类型:
type T<'a> = N of 'a * T<'a> list
可以声明为:
let ta = N("b", [N("c", [])])
我如何获得此树中的所有可能路径?我已尝试应用提到的in this post方法,但它只返回一个空列表。这就是我实施它的方式:
let rec isPath is t =
match t with
| N(x, t) -> List.collect (isPath (x::is)) t
isPath [] ta |> (printf "isPath: %A")
但它只返回isPath: []
。我究竟做错了什么?我的第二个目标是创建第二个函数,我可以传递一个int列表来检查是否有与此列表对应的路径。
答案 0 :(得分:3)
您需要另一个匹配条件来捕获空列表并且不会迭代它们。现在你的List.collect
,当t
为空时,正在迭代一个空列表,因此将一个空列表返回到&#34;之前的&#34;递归函数的级别。然后将所有这些空列表附加在一起以获得...一个空列表,依此类推。
添加以下匹配案例,您应该得到所需内容:
| N(x, []) -> is
请注意,在其他匹配案例之前,应该以便工作:由于F#处理从上到下匹配案例,N(x, t)
将匹配任何内容,N(x, [])
如果它是第二个,我们将不会受到检查。
所以你希望你的功能看起来像:
let rec isPath is t =
match t with
| N(x, []) -> is
| N(x, t) -> List.collect (isPath (x::is)) t
同样,如果你不明白为什么会有效,请告诉我,我会进一步解释。