只是为了跟进您的答案。
在模式匹配中,与变量的匹配似乎不一定与其值匹配。
这就是它被称为的原因模式匹配并不是价值匹配.
顾名思义,模式匹配用于匹配事物patterns, not values。在问题中显示的代码中,您实际上并未将任何内容与x
or y
,您正在定义名为的模式x
and 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
,这就是您的自我回答中的代码有效的原因。但这无论如何都不是模式的用途。
你实际上想做的是not模式匹配,它是一个简单的条件语句。
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
除非您定义相互递归的值。