问题描述
let rec matchs str currList =
match currList with
| [] -> []
| (str,_) as hd :: tl -> hd :: matchs str tl
| _::tl -> matchs str tl
matchs "A" [("A",5); ("BB",6); ("AA",9); ("A",0)];;
这是给定的输出
val it : (string * int) list = [("A",0)]
我不明白为什么它不只给我匹配“A”的元组
最终我希望我的输出是
val it : int list = [0; 5]
解决方法
TL;DR:您无法匹配变量内容,只能匹配文字和构造函数(以及活动模式)。
这个比赛案例:
| (str,_) as hd :: tl ->
与您的直觉相反,它不仅仅匹配以 str
作为第一个组件的元组。相反,它匹配任何元组,然后将这些元组的第一个组件绑定到名称str
,隐藏同名的函数参数。
这是这个问题的简化版本:
let x = 42
let y = 5
match y with
| x -> printfn "%d" x
| _ -> printfn "not equal to x"
此代码将打印出“5”,而不是“42”。并且您会收到编译器警告,表示永远不会达到第二个匹配项。
如果您只想要带有 str
首个组件的元组,您可以在您的模式中使用 when
保护:
| (s,_) as hd :: tl when s == str ->