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

Ocaml 为什么是`;`在utop中给我一个语法错误?,ocaml,utop,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!!";; 设c= 让x=“for(int i=0;i,所以我不完全理解它为什么这样工作,但我至少理解它是如何工

我正在做一个简短的项目,将小程序从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!!";;
设c=

让x=“for(int i=0;i,所以我不完全理解它为什么这样工作,但我至少理解它是如何工作的

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

简言之,我应该打字

 function
 | i when i = x -> y
 | i when i = y -> x
 | _ -> "Oh no!!";;
如果有人能更清楚地说明当I=x->y
时,
“x->y”
I的区别,我仍然对此感到好奇


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

只需继续回答即可

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

这就是为什么它被称为模式匹配,而不是值匹配

顾名思义,模式匹配用于将事物与模式而非值进行匹配。在问题中显示的代码中,您实际上并没有将任何事物与
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=x
时,模式
i实际上与外部变量
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>
let c参数=

让x=“为(int i=0;i.复制粘贴代码。您编写了
let…in let…
,这没有任何意义。如果您想在顶层定义
c
,您需要从
let c=…
开始。如果您想在单个表达式中定义
c
,则表达式丢失。@Gilles我试图复制粘贴代码,但无法我找不到一种方法来说明utop是在;;下面加下划线。你知道怎么做吗?@Gilles在
let x=“”和y=“”之前,我试着从
let c=
开始在
中,但这使得x&y在匹配情况下未被使用。假设您希望返回
函数
,则必须使用
让c=…在c;;
中,或者删除
让c=
。原因是,若您所拥有的都是
表达式,那个么代码段的结果类型是什么?
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!"