Recursion 扁平化递归数据结构

Recursion 扁平化递归数据结构,recursion,f#,Recursion,F#,我有一个注释线程列表形式的递归数据结构。每个评论可以包含零个或多个回复(评论),每个回复可以包含零个或多个回复。我正在尝试编写一个函数来平展这个注释线程列表,即给定一个注释线程列表,所有注释都应该作为“顶级”注释返回,而不需要任何回复。我已经为此编写了一个函数,但它不工作,它将返回一个空列表 type Comment = { Text : string Score : int Replies : Comment list } let flattenReplies

我有一个注释线程列表形式的递归数据结构。每个评论可以包含零个或多个回复(评论),每个回复可以包含零个或多个回复。我正在尝试编写一个函数来平展这个注释线程列表,即给定一个注释线程列表,所有注释都应该作为“顶级”注释返回,而不需要任何回复。我已经为此编写了一个函数,但它不工作,它将返回一个空列表

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

您基本上需要实现/算法。 此外,执行此类操作可能表明初始数据结构不适合您的需要

由于您的问题听起来像是一个家庭作业问题,我做了一个简单的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 []
输入注释=
{文本:字符串
回复:评论列表}
让回复=函数{Text=\\回复=rs}->rs
让我们看看回复(cs:评论列表)=
让rec展平q res=
匹配q
|[]->res

|h::t->plant您基本上需要实现/算法。 此外,执行此类操作可能表明初始数据结构不适合您的需要

由于您的问题听起来像是一个家庭作业问题,我做了一个简单的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 []
输入注释=
{文本:字符串
回复:评论列表}
让回复=函数{Text=\\回复=rs}->rs
让我们看看回复(cs:评论列表)=
让rec展平q res=
匹配q
|[]->res
|h::t->展平