2015-10-14 30 views
2

我最初認爲「as」和冒號操作符意味着完全相同的事情,爲一個值或函數指定一個類型。但我實際上發現不一致:「as」和冒號指定類型之間的區別?

type Uppercase = string -> string 
let uppercase:Uppercase = fun n -> 
    //code 

這工作正常。但是,如果我改變冒號爲「as」

type Uppercase = string -> string 
let uppercase as Uppercase = fun n -> 
    //code 

它打破了,說它不知道什麼類型「n」是。當然,我可以通過這樣做來解決這個問題

type Uppercase = string -> string 
let uppercase as Uppercase = fun (n:string) -> 
    //code 

它又開心了。所以,我的問題是,爲什麼「as」與冒號不同?爲什麼F#在使用「as」時無法進行類型推斷?謝謝。

+1

關鍵字'as'與C#中的關鍵字不同。它與F#中的類型無關。它用於將表達式綁定爲單個值,在使用歧視聯合時非常有用。 – Gustavo

回答

5

as用於命名模式匹配的結果,例如,

let (a,b) as t = (1,2) 

將結合a爲1,b至2和t整個對。因此

let uppercase as Uppercase = fun n -> ... 

結合的名稱uppercaseUppercase的功能。在這個函數中,沒有指定n的類型,所以你得到類型錯誤。

as因此與顯式類型聲明有很大不同,不能互換使用。

+0

謝謝!我無法找到關於「as」所做的任何文檔。我不知道它是這樣做的! – Konata

+2

這是一個關鍵詞,因此在此處列出:https://msdn.microsoft.com/en-us/library/dd233249.aspx – DaveShaw

相關問題