假设您要编写一个函数“gen”,该函数生成一个具有由类型列表给出的签名的函数:
let gen (sig:Type list) = ....
let sig = [ typeof<int>; typeof<int[]>; typeof<float> ]
let func = gen sig
then func is of type: int -> int[] -> float -> unit
我想到了两种可能的解决方案:
a) 使用 Reflect Emit,但我不知道这样我们是否可以让 IntelliSense 工作?Reflect Emit 似乎创建了 IntelliSense 可能看不到的新 .net 代码,因此它可能不会在编译时验证代码。
b)使用类型提供者,但我担心它太重并且可能不实用。
c)使用泛型,如gen<'T1> (sig:Type list) : 'T2 -> unit
,这可能需要递归调用,但我不知道如何做到这一点。
我更喜欢方法 c),因为它是轻量级的,并且可以在编译时检查。还是有替代方法?