只需跟进您的答案。
在模式匹配中,匹配到一个变量似乎不一定匹配到它的值。
这就是为什么它被称为模式匹配而不是值匹配的原因。
顾名思义,模式匹配用于匹配事物与模式,而不是值。在您在问题中显示的代码中,您实际上并没有将任何内容与x
or进行比较y
,您正在定义命名的模式x
并且y
可以匹配任何内容。请参见下面的示例:
match 2 with
| x -> "Hey, I matched!"
| _ -> "Oh, I didn't match.";;
- : string = "Hey, I matched!"
请注意,即使x
先前已定义,这也有效。在匹配的情况下,x
来自模式的实际上正在遮蔽另一个。
let x = 42 in
match 1337 with
| x -> Printf.printf "Matched %d\n!" x
| _ -> ();;
Matched 1337!
- : unit = ()
另一方面,模式i when i = x
实际上与外部变量的值匹配x
,这就是您的自我回答中的代码有效的原因。但这不是模式的用途。
您实际上要做的不是模式匹配,而是一个简单的条件语句。
let c argument =
let x = "for (int i = 0; i<10; i++)" in
let y = "for i in range(0,10):" in
if argument = x then y
else if argument = y then x
else "Oh no!";;
val c : string -> string = <fun>
它在行动中:
c "for (int i = 0; i<10; i++)";;
- : string = "for i in range(0,10):"
c "for i in range(0,10):";;
- : string = "for (int i = 0; i<10; i++)"
c "whatever";;
- : string = "Oh no!"
and
此外,除非您定义相互递归的值,否则不要使用。