[英]Types and functions
考慮以下:
type T () =
member x.y = 4
let a =
let fn () (k: T) = ()
fn ()
let b =
let fn () (k: System.IO.Directory) = ()
fn ()
a
而未能b
是確定的。 錯誤消息是:
值'a'被推斷為具有泛型類型val a:('_a - > unit)當'_a:> T要么使參數'a'顯式,要么如果你不打算使它是通用的,添加類型注釋
為什么以及如何解決這個問題?
錯誤消息本身告訴您確切需要做什么 - 添加類型注釋:
let a : T -> unit =
let fn () (k: T) = ()
fn ()
您看到的錯誤擺在首位的原因是編譯器試圖概括的定義a
(見這部分的規范),這將導致你錯誤消息見奇簽名。
您不需要為b
執行此操作的原因是System.IO.Directory
已被密封,因此無需進行概括。
您正面臨一個值限制,因為a
看起來像一個常量,但它返回一個函數。 看看這個問題:
一個簡單的方法來解決它是加入一個變量來定義a
。
let a x =
let fn () (k: T) = ()
fn () x
我不知道為什么它的某些類型有效,這就是b
的情況
如果T所在的記錄而不是類,那就行了。 但出於某種原因,如果T是一個類,你必須拼寫出編譯器,
type T () =
member x.y = 4
let a<'U when 'U :> T> =
let fn () (k: 'U) = ()
fn ()
let test0 = a<T> (T()) // You can be explicit about T,
let test1 = a (T()) // but you don't have to be.
編輯:所以我用這個玩了一下,奇怪的是,編譯器似乎滿足於任何類型的限制:
type T () =
member x.y = 4
type S () =
member x.z = 4.5
let a<'U when 'U :> S> =
let fn () (k: T) = ()
fn ()
let test = a (T()) // Is OK
let test = a<T> (T()) // Error: The type 'T' is not compatible with the type 'S'
類型S與上面的代碼中的任何內容無關,編譯器仍然樂於接受任何類型的限制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.