这段代码是如何工作的?

use*_*938 2 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 
Run Code Online (Sandbox Code Playgroud)

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

它怎么样?

rmu*_*unn 5

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

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