我想生成一个静态方法这个签名A -> B -> C
但我只能生成A * B -> C
:
ProvidedMethod(name, [ ProvidedParameter("A", aType); ProvidedParameter("B", bType) ], cType, IsStaticMethod = true)
我不能手动进行柯里化,因为函数类型在类型提供程序中不能正常工作,只能委托类型。有没有其他我不知道的方法可以做到这一点,或者这根本不支持?
我想生成一个静态方法这个签名A -> B -> C
但我只能生成A * B -> C
:
ProvidedMethod(name, [ ProvidedParameter("A", aType); ProvidedParameter("B", bType) ], cType, IsStaticMethod = true)
我不能手动进行柯里化,因为函数类型在类型提供程序中不能正常工作,只能委托类型。有没有其他我不知道的方法可以做到这一点,或者这根本不支持?
我怀疑您不能简单地使用 ProvidedMethod 进行柯里化。但是,您可以让您的方法返回一个包装参数应用程序的函数。
public Func<A, Func<B, C>> Curry<A, B, C>(Func<A, B, C> func)
{
return a1 => a2 => func(a1, a2);
}
上面在 C# 中给出的示例以更明确地显示类型,在类型提供程序中,这将类似于以下内容。
let retType = typeof<('a -> ('b -> 'c)>
let ftype = typeof<('a -> 'b -> 'c>
let method = ProvidedMethod(name, [ProvidedParameter("Func", ftype)], retType)
我目前手头没有 F# 编译器(我在 iPad 上),但希望这是朝着正确方向的推动。