为什么`;;`在utop中给我一个语法错误?

时间:2017-12-02 21:03:36

标签: ocaml utop

我正在开展一个简短的项目,将小程序从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匹配。

为了使这项工作成功,需要写出什么顺序?

2 个答案:

答案 0 :(得分:2)

只需跟进你的回答。

  

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

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

顾名思义,模式匹配用于匹配模式的内容,而非。在您在问题中显示的代码中,您实际上并未将任何内容与dancer2x进行比较,而是定义了可以匹配任何内容的名为yx的模式。请参阅以下示例:

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帮助我更好地理解陈述的优先级。