2017-09-15 52 views
8

此代碼編譯的F#就好以及OCaml的:爲什麼這個F#/ OCaml「匹配」表達式編譯?

let testmatch k = 
    match k with 
    | jqk3jtl23jtlk123 -> true 

我已經在這兩個FSI和UTOP測試。它總是返回true

jqk3jtl23jtlk123是完全隨機的,其類型推斷爲'a。即使我約束k與數據類型(如let testmatch (k: int) =)彙編(雖然明顯制約testmatch的類型int -> bool,而不是'a -> bool

可能有人請解釋一下這是怎麼回事具體來說:?

  • 爲什麼編譯器接受一個完全隨機的文字jqk3jtl23jtlk123
  • 爲什麼我沒有得到一個非窮盡匹配的警告?
  • 什麼是真正在做什麼?
  • 比賽
+7

你不匹配對價值'jqk3jtl23jtlk123',你要創建一個名爲'jqk3jtl23jtlk123'值匹配任何'k'是。 – Marth

+2

在這些語言中,您通常處於值表達式或模式匹配表達式中,並且這兩種行爲有所不同。模式匹配發生在'match ... with'之後,'function'之後,以及任何函數/方法參數中。 – TheQuickBrownFox

回答

15

在這種情況下,「文字」jqk3jtl23jtlk123是一個有效的變量名稱,因此->左側的圖案與您寫入let jqk3jtl23jtlk123 = k時的圖案相同。由於它接受任何值k,並且不約束其類型,因爲綁定適用於所有類型,推斷類型爲'a,這是類型系統可以表示的最通用的值。

如果您將文字變成某種不是有效的標識符的東西,例如以數字開頭,它將無法編譯。

如果將文字包裝在引號中,它將被解釋爲字符串值文字,您應該得到無窮無盡的匹配警告,並且會將k的類型限制爲string

9

這是一個通配符模式,其名稱與k相等。這相當於

let testmatch k = 
    let jqk3jtl23jtlk123 = k in 
    true 
相關問題