繁体   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