2014-11-22 127 views
1

我一直在尋找的模式在F#類型匹配語法描述如下:與「:?輸入名稱」匹配的F#類型:爲什麼我們需要一個新名稱?

http://msdn.microsoft.com/de-de/library/dd547125.aspx#sectionToggle14

實例從該頁面(略有修改):

open System.Windows.Forms 

let RegisterControl (control: Control) = 
    match control with 
    | :? Button as button -> button.Text <- "Registered." 
    | :? CheckBox as checkbox -> checkbox.Checked <- false 
    | _ ->() 

我不明白的是爲什麼我們需要引入一個新名稱(「button」,「checkbox」)以及類型檢查。如果匹配成功,編譯器應該知道「控制」具有所需的類型,並可以在下面的表達式/語句中對其進行相應處理。換句話說,我爲什麼不能做到這一點:

open System.Windows.Forms 

let RegisterControl (control: Control) = 
    match control with 
    | :? Button -> control.Text <- "Registered." 
    | :? CheckBox -> control.Checked <- false 
    | _ ->() 

這將是類似"type guard" feature in TypeScript 1.4

F#有沒有這麼好的理由? (注:我運行VS 2012)

回答

4

一個明顯的原因,你需要一個新的名字時match參數是一個表達式:

match some.Method() with 
| :? Button -> // What to do here?? 

當然,語言可以支持的符號。在這種情況下,沒有技術上的原因可能導致你無法做到這一點,但我認爲不這樣做的邏輯理由是相當好的。

F#中的每個值都有一個顯式聲明的位置(當你使用一個值時,你總是可以定義)。這將使用這個簡化:? Type語法來定義的值不會真的有什麼聲明

  • 你可以說,他們在那裏的原始變量聲明點聲明,但這是錯誤的 - 因爲,它會有不同的類型。

  • 或者你可以說它們是以某種「隱藏的方式」來聲明的,但是這會給這個語言帶來一個全新的概念。

這就是說,我可以看到爲什麼語法是好的和有用的。但它似乎與F#中變量的工作原理並不相符。

+0

確實,這是非常明顯的。猜猜我太專注於例子。謝謝。 – 2014-11-22 18:37:33

+0

示例驅動的語言設計:-) – 2014-11-22 19:20:49

+1

示例驅動的語言理解,不可避免地帶有愚蠢的問題:)我不會僅僅基於示例進入語言設計,承諾。 – 2014-11-23 16:16:40

2

這將爲不一致的模型交易一致的模型。

您需要引入一個新名字並不完全正確。這工作得很好:

match control with 
| :? Button -> doButtonyStuff control 
| :? CheckBox -> doCheckBoxyStuff control 
| _ ->() 

當然除了你control值保持在比賽中的情況下機構中Control。只有當您想要在匹配模式中進行類型檢查(C#風格is)和演員表(C#風格as)時纔會引入該名稱。

你的建議可以很容易地想象爲在演員投入後你有一個隱含的暗影control: Control你在與另一個control: Button的比賽中使用。我看到的一個問題是,它具有使control: Control在匹配案例主體中不可訪問的副作用。這在你的特定例子中可能不是什麼大問題,但是如果你檢查接口類型,它可能會變得笨拙。

沒有模式匹配結構今天做這樣一個隱含的事情。除非你自己這樣做,否則你的綁定不會被遮蔽。如果你問我,這很好。顯式比隱式更好。

+0

我認爲接口的情況並不是問題,因爲.NET泛型具有類似的語義:可以將類型參數約束爲任意類型並實現多個接口,編譯器將處理根據請求的使用情況,鍵入爲類型或界面之一。 – 2014-11-23 16:22:36

+0

這肯定比Button vs Control示例更具問題。在F#接口中只有顯式實現,因此要訪問需要轉換爲接口類型的接口方法(此時不再可以訪問非接口方法,則需要轉換回具體類型)。按鈕可能會重新呈現Control提供的所有重要內容,所以這會減少痛苦。 – scrwtp 2014-11-23 17:57:40

相關問題