考慮下面的代碼:'選項<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
這是爲什麼?我忽略了什麼?
考慮下面的代碼:'選項<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
這是爲什麼?我忽略了什麼?
如果你真的想檢查相等(而不是指定的值),那麼你可以使用Option.isNone fnOption
。如果你真的想分配,看看kvb的答案。
這是真的。我沒有注意到這個功能。那麼這是否意味着F#試圖做一個結構平等?但是,它又可以立即看到Some XXX <> None,甚至不需要檢查裏面的內容。 –
錯誤發生在編譯時,而不是運行時。 F#編譯器**嘗試**編譯代碼,但失敗,因爲'類型'(unit - > unit)'不支持'等於'約束'。在動態語言上(沒有預編譯類型檢查),它可能適用於結構相等。 –
現在我明白了。感謝您的澄清 –
目前還不清楚你想要做什麼。既然這樣,第二行是平等測試,不是分配。如果你打算做的是一個新的值賦給fnOption
,那麼你需要使它可變:
let mutable fnOption = Some(fun() ->())
fnOption <- None
如果你真的想測試平等,那麼你看到的錯誤是預期的結果,因爲功能不具有可比性。
函數是FP一流的價值,但他們是特殊類型的,因爲它們用來產生基於參數其它值的感測值u的傳遞給他們,因此它沒有意義的比較2層的功能和作爲結果是沒有爲功能定義的相等運算符 – Ankur