如何模仿F#编译器类型检查?

orl*_*dpm 4 f#

在F#中,我可以编写一个函数(fun x -> x * x)并确认它具有类型,int->int因为以下代码可以编译:

let typeCheck<'T> (x:'T) = ()
typeCheck<int->int> (fun x -> x*x)
Run Code Online (Sandbox Code Playgroud)

另一方面,GetType由于此功能与typeof<int->int>以下观点不同:

> (fun x -> x*x).GetType() = typeof<int -> int>
val it : bool = false
Run Code Online (Sandbox Code Playgroud)

如果不是GetType()typeof,我可以调用哪些函数来模仿编译器进行的类型检查?

Tom*_*cek 6

GetType特定lambda函数之所以与之不同,typeof<int -> int>是因为F#编译器为继承自的函数生成了一个新类int -> int。换句话说,类型不同,但是您通过所获得的类型GetType继承自int -> int

您可以使用轻松检查IsAssignableFrom。以下是true

typeof<int -> int>.IsAssignableFrom((fun x -> x*x).GetType())
Run Code Online (Sandbox Code Playgroud)