这段代码是如何工作的?

时间:2015-10-02 06:58:18

标签: f# f#-interactive

我刚刚面对以下代码。

let rec Make_Segment list=
  match list with
  | []  ->[],[]
  | hd::tail when hd<=tail.Head -> let current,rest=Make_Segment tail
                                   hd::current,rest
  | hd::tail when hd>tail.Head -> [hd], tail

let segments= [3;4;5;5;1;2;3]

Make_Segment segments 

这是一个递归函数,它总是返回两个列表。 但正如您所看到的,它总是在匹配中使用一个参数,即list。 那么第一个论点在哪里?

它是如何运作的?

1 个答案:

答案 0 :(得分:5)

match语句中,list参数被语法hd::tail拆分为两个值。这将匹配任何非空的列表(这也是为什么还需要与空列表匹配的原因),并且列表的第一项将被赋予名称hd,而其余的列表list的名称为tail。 (如果原始list只有一个项目,那么tail现在将是一个空列表。

然后,当进行递归调用时,它返回两个列表的元组,由let current,rest=Make_Segment tail赋值得到 destructured 。第一个列表分配给current,第二个列表分配给rest