3

このシグネチャの静的メソッドを生成したいA -> B -> C

しかし、私は生成することしかできませんA * B -> C:

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

関数型は型プロバイダーでは正しく機能せず、デリゲート型のみが機能するため、カリー化を手動で行うことはできません。私が気付いていない他の方法はありますか、それともまったくサポートされていませんか?

4

1 に答える 1

1

単純に 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 を使用しています) が、これが正しい方向に進むことを願っています。

于 2013-04-29T20:48:10.463 に答える