我有一个注释线程列表形式的递归数据结构。每条评论可以包含零个或多个回复(评论),每个回复可以包含零个或多个回复。我试图编写一个函数来展平这个注释线程列表,即给定一个注释线程列表,所有注释都应该返回为" top-level"评论没有任何回复。我已为此编写了一个函数,但它不起作用,它将返回一个空列表。
type Comment =
{ Text : string
Score : int
Replies : Comment list }
let flattenReplies ({ Comments = cs }) =
let rec flatten st =
match st with
| [] ->
st
| hd::tl ->
{ hd with Replies = [] }
:: tl
|> List.collect (fun c -> flatten c.Replies)
cs
|> Seq.toList
|> flatten
答案 0 :(得分:0)
您基本上需要实施DFS / BFS算法。 此外,执行此类操作可能表明您的初始数据结构不符合您的需求。
由于你的问题听起来像是一个家庭作业问题,我做了一个简单的DFS实现,当然你可以弄清楚其余的:
type Comment =
{ Text : string
Replies : Comment list }
let replies = function {Text = _; Replies = rs} -> rs
let flattenReplies (cs : Comment list) =
let rec flatten q res =
match q with
| [] -> res
| h::t -> flatten <| (replies h) @ t <| {h with Replies = []}::res
flatten cs []