只需跟進您的答案。
在模式匹配中,與變量匹配不一定看起來與其值相匹配。
這正是它之所以被稱爲模式匹配,而不是值匹配。
顧名思義,模式匹配被用於匹配圖案,不值的東西。在問題中顯示的代碼中,您實際上沒有將任何內容與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
。
[不要張貼文字的截圖](https://meta.stackoverflow.com/questions/303812/discourage-screenshots-of-code-and-or-errors)。複製粘貼代碼。 – Gilles
你寫了'let ... let ...',那沒有道理。如果你想在頂層定義'c',你需要'let c = ...'開頭。如果您想在單個表達式中定義'c',則缺少表達式。 – Gilles
@Gilles我試圖複製粘貼代碼,但找不到一種方法來說明utop強調了;;。你知道怎麼做嗎? –