我正在处理一个带有两个参数的函数:匹配值和元组列表。目标是将每个元组中的第一个值(一个字符串)与匹配值(也是一个字符串)相匹配,并将那些匹配元组中的第二个值(一个int)添加到一个新的列表中,该列表按排序顺序返回。我开始时:
let getElems strMatch tupList =
let rec loop acc = function
| [] -> acc
| hd :: tl ->
match hd with
| (strMatch, v) -> loop (v :: acc) tl
| _ -> loop (acc) tl
List.sort (loop [] tupList)
...但后来意识到strMatch作为模式匹配超出了范围,因此第二条规则永远不会匹配。所以我开始尝试将strMatch传递给内部代码块,如下所示:
let getElems strMatch tupList =
let rec loop strMatch acc tupList =
match tupList with
| [] -> acc
| hd :: tl ->
match hd with
| (strMatch, v) -> loop strMatch (v :: acc) tl
| _ -> loop strMatch (acc) tl
List.sort (loop strMatch [] tupList)
...但是匹配块中的值仍然超出范围。我想有可能将strMatch传递给那些块,但这看起来很混乱,我想知道是否有更优雅的方式。
编辑:所以这是我的结果...... 首先,我收到警告“此规则永远不会匹配”。当我按原样运行函数时:getElems "A" [("A",5);("BB",6);("AA",9);("A",0)];;
> val it : int list = [0; 5; 6; 9]
但是如果我在函数中硬编码strMatch为“A”:
getElems "A" [("A",5);("BB",6);("AA",9);("A",0)];;
> val it : int list = [0; 5]
这是所希望的。但是我需要把任何一场比赛作为争论。