如何为ProvideMethod生成curried参数?

时间:2013-04-15 10:45:00

标签: f# type-providers f#-3.0

我想通过签名A -> B -> C

生成一个静态方法

但我只能生成A * B -> C

ProvidedMethod(name, [ ProvidedParameter("A", aType); ProvidedParameter("B", bType) ], cType, IsStaticMethod = true)

我无法手动进行currying,因为函数类型在类型提供程序中无法正常工作,只能委托类型。有没有其他方法可以做到这一点,我不知道,或者这根本不受支持?

1 个答案:

答案 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上),但希望这是朝着正确的方向发展。