2017-12-02 201 views
2

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

什么命令都需要写入使这项工作?

+2

[不要张贴文字的截图](https://meta.stackoverflow.com/questions/303812/discourage-screenshots-of-code-and-or-errors)。复制粘贴代码。 – Gilles

+1

你写了'let ... let ...',那没有道理。如果你想在顶层定义'c',你需要'let c = ...'开头。如果您想在单个表达式中定义'c',则缺少表达式。 – Gilles

+0

@Gilles我试图复制粘贴代码,但找不到一种方法来说明utop强调了;;。你知道怎么做吗? –

回答

2

只需跟进您的答案。

在模式匹配中,与变量匹配不一定看起来与其值相匹配。

这正是它之所以被称为模式匹配,而不是值匹配

顾名思义,模式匹配被用于匹配图案,不的东西。在问题中显示的代码中,您实际上没有将任何内容与xy进行比较,您正在定义名为xy的模式,它们可以匹配任何内容。看下面的例子:

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

0

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

我的问题是,在模式匹配中,与变量匹配不一定看起来与其值相匹配。

总之,我应包括打字

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

如果任何人都可以摆脱什么区别于I when I = x -> y"x -> y"一些更多的光线,我仍然好奇这一点。

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

相关问题