2

我正在做一个简短的项目,将小程序从 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 和 y 都被认为是未绑定的,但同时任何参数似乎都与 x 匹配。

需要按照什么顺序编写所有内容才能完成这项工作?

4

2 回答 2

2

只需跟进您的答案。

在模式匹配中,匹配到一个变量似乎不一定匹配到它的值。

这就是为什么它被称为模式匹配而不是值匹配的原因。

顾名思义,模式匹配用于匹配事物与模式,而不是。在您在问题中显示的代码中,您实际上并没有将任何内容与xor进行比较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此外,除非您定义相互递归的值,否则不要使用。

于 2017-12-05T11:22:20.593 回答
0

所以我不完全理解为什么它会这样工作,但我至少理解它是如何工作的。

我的问题是,在模式匹配中,与变量的匹配似乎不一定与其值匹配。

简而言之,我应该打字

 function
 | i when i = x -> y
 | i when i = y -> x
 | _ -> "Oh no!!";;

如果有人可以进一步了解与 的区别"x -> y"I when I = x -> y我仍然对此感到好奇。

否则,感谢@ghilesZ 向我发送了我需要解决这个问题的链接!感谢@BahmanMovaqar 帮助我更好地理解语句的优先级。

于 2017-12-03T20:17:11.930 回答