我想通过签名A -> B -> C
但我只能生成A * B -> C
:
ProvidedMethod(name, [ ProvidedParameter("A", aType); ProvidedParameter("B", bType) ], cType, IsStaticMethod = true)
我无法手动进行currying,因为函数类型在类型提供程序中无法正常工作,只能委托类型。有没有其他方法可以做到这一点,我不知道,或者这根本不受支持?
答案 0 :(得分:1)
我怀疑你不能简单地使用提供的方法进行currying。但是,您可以使您的方法返回一个包装参数应用程序的函数。
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上),但希望这是朝着正确的方向发展。