在將其標記爲重複之前:我知道這個問題與使用unit作爲類型參數時有關編譯錯誤的各種問題有關。一些例子:單位是什麼條件?
- Why is
unit
treated differently by the F# type system when used as a generic interface argument? - F# interface inheritance failure due to unit
- Using unit as Type Parameter and overriding methods
這些都遇到了類似這樣的一個問題:
type Interface<'a> =
abstract member MyFunc : unit -> 'a
let implementingInstance =
{ new Interface<_> with
member __.MyFunc() =() } // Compiler error!
據我所知,代碼不會編譯,因爲使用編譯單元返回函數在內部返回,這是CLI的一個額外功能,而不是一種類型。
但是!下面似乎滿足編譯器:
type RecordVersion<'a> =
{ MyFunc : unit -> 'a }
let recordInstance =
{ MyFunc = ignore }
這也適用,如果我有一個lambda或let
結合的模塊功能取代ignore
。
對我來說,這只是另一個完全相同的事情。 (儘管與F#設計準則不一致,後者建議優先使用接口而不是功能執行記錄類型。)
我對設計API的用戶指定使用的行爲和類型感興趣。因此,我想避免出現意外和令人困惑的編譯器錯誤的情況。但我不太確定該怎麼做。它看起來像F#的「功能」功能做作爲一種類型的處理單元。
單位有這樣的虛假錯誤的確切條件是什麼?我可以通過打破設計準則並使用函數的記錄而不是接口來避免它們出現在我的API中嗎? (我不介意,但我不確定它是否能解決問題。)
absurd :: Void - > a(Haskell)我認爲這有點相關;-) –
因爲這是關於通用API的設計,所以這可能是相關的:http://stackoverflow.com/a/34028711/126014 –