我正在开展一个简短的项目,将小程序从python转换为java,反之亦然。 我创建了以下代码,并在utop中进行了测试。
let c =
let x = "for (int i = 0; i<10; i++)"
and y = "for i in range(0,10):"
in function
| x -> y
| y -> x
| _ -> "Oh no!!";;
出于某种原因,x&amp; y都被认为是未绑定的,但同时任何参数似乎都与x匹配。
为了使这项工作成功,需要写出什么顺序?
答案 0 :(得分:2)
只需跟进你的回答。
在模式匹配中,与变量的匹配似乎不一定与其值匹配。
这就是为什么它被称为模式匹配而非值匹配的原因。
顾名思义,模式匹配用于匹配模式的内容,而非值。在您在问题中显示的代码中,您实际上并未将任何内容与dancer2
或x
进行比较,而是定义了可以匹配任何内容的名为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!"
。
答案 1 :(得分:0)
所以我没有完全理解为什么它以这种方式工作,但我至少理解它是如何工作的。
我的问题是,在模式匹配中,与变量的匹配似乎不一定与其值匹配。
简而言之,我应该输入
function
| i when i = x -> y
| i when i = y -> x
| _ -> "Oh no!!";;
如果有人能够更清楚地了解"x -> y"
与I when I = x -> y
的区别,我仍然对此感到好奇。
否则,感谢@ghilesZ向我发送了我需要想出的链接!并感谢@BahmanMovaqar帮助我更好地理解陈述的优先级。