我刚刚面对以下代码。
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
。
那么第一个论点在哪里?
它是如何运作的?
答案 0 :(得分:5)
在match
语句中,list
参数被语法hd::tail
拆分为两个值。这将匹配任何非空的列表(这也是为什么还需要与空列表匹配的原因),并且列表的第一项将被赋予名称hd
,而其余的列表list的名称为tail
。 (如果原始list
只有一个项目,那么tail
现在将是一个空列表。
然后,当进行递归调用时,它返回两个列表的元组,由let current,rest=Make_Segment tail
赋值得到 destructured 。第一个列表分配给current
,第二个列表分配给rest
。