F# 模式匹配字符串

问题描述

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 ->