为什么`;;`在utop中给我一个语法错误?
我正在开发一个简短的项目,将小程序从python转换为java,反之亦然。 我创建了以下代码,并在utop中进行了测试。为什么`;;`在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。
什么命令都需要写入使这项工作?
回答:
只需跟进您的答案。
在模式匹配中,与变量匹配不一定看起来与其值相匹配。
这正是它之所以被称为模式匹配,而不是值匹配。
顾名思义,模式匹配被用于匹配图案,不值的东西。在问题中显示的代码中,您实际上没有将任何内容与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!"
同样,除非你定义相互递归值不使用and
。
回答:
所以我不完全理解它为什么这样工作,但我至少明白它是如何工作的。
我的问题是,在模式匹配中,与变量匹配不一定看起来与其值相匹配。
总之,我应包括打字
function | i when i = x -> y
| i when i = y -> x
| _ -> "Oh no!!";;
如果任何人都可以摆脱什么区别于I when I = x -> y
"x -> y"
一些更多的光线,我仍然好奇这一点。
否则,感谢@ghilesZ发送给我的链接,我需要把这个链接出来!并感谢@BahmanMovaqar帮助我更好地理解语句的优先级。
以上是 为什么`;;`在utop中给我一个语法错误? 的全部内容, 来源链接: utcz.com/qa/258329.html