2017-12-02 200 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幫助我更好地理解語句的優先級。

相關問題