2011-07-15 41 views
2

考慮下面的代碼:'選項<unit->單元>類型和平等' 使用F#

let fnOption = Some (fun() ->()) 
fnOption = None 

它提供了以下錯誤:

init.fsx(2,1): error FS0001: The type '(unit -> unit)' does not support the 'equality' constraint because it is a function type

這是爲什麼?我忽略了什麼?

+0

函數是FP一流的價值,但他們是特殊類型的,因爲它們用來產生基於參數其它值的感測值u的傳遞給他們,因此它沒有意義的比較2層的功能和作爲結果是沒有爲功能定義的相等運算符 – Ankur

回答

2

如果你真的想檢查相等(而不是指定的值),那麼你可以使用Option.isNone fnOption。如果你真的想分配,看看kvb的答案。

+0

這是真的。我沒有注意到這個功能。那麼這是否意味着F#試圖做一個結構平等?但是,它又可以立即看到Some XXX <> None,甚至不需要檢查裏面的內容。 –

+3

錯誤發生在編譯時,而不是運行時。 F#編譯器**嘗試**編譯代碼,但失敗,因爲'類型'(unit - > unit)'不支持'等於'約束'。在動態語言上(沒有預編譯類型檢查),它可能適用於結構相等。 –

+0

現在我明白了。感謝您的澄清 –

2

目前還不清楚你想要做什麼。既然這樣,第二行是平等測試,不是分配。如果你打算做的是一個新的值賦給fnOption,那麼你需要使它可變:

let mutable fnOption = Some(fun() ->()) 
fnOption <- None 

如果你真的想測試平等,那麼你看到的錯誤是預期的結果,因爲功能不具有可比性。

+0

這些功能不具有可比性,但選項是正確的?我可以這樣做:'讓a =一些4; A = None' –

+0

他可以使用一些ID而不是一些(樂趣() - >())? – Alex

+2

@Alex - 不,功能類型的值沒有可比性,所以既不是包含的功能(無論實際值是什麼)選項。即使'(None:(unit - > unit)option)= None'也不會編譯,因爲編譯器不會「查看」選項值;是否可以比較這些值的確定僅基於它們的類型。 – kvb

相關問題