簡體   English   中英

類型和功能

[英]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看起來像一個常量,但它返回一個函數。 看看這個問題:

了解F#值限制錯誤

一個簡單的方法來解決它是加入一個變量來定義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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM