F#计算作为参数传递给函数的变量(超出范围)

时间:2017-05-20 18:12:10

标签: variables scope pattern-matching lazy-evaluation f#-3.0

我正在处理一个带有两个参数的函数:匹配值和元组列表。目标是将每个元组中的第一个值(一个字符串)与匹配值(也是一个字符串)相匹配,并将那些匹配元组中的第二个值(一个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]

这是所希望的。但是我需要把任何一场比赛作为争论。

0 个答案:

没有答案