Как сгенерировать каррированные аргументы для ProvidedMethod?

Я хочу сгенерировать статический метод для этой подписи A -> B -> C

Но я могу сгенерировать только A * B -> C:

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

Я не могу сделать каррирование вручную, потому что типы функций не работают правильно в поставщиках типов, только типы делегатов. Есть ли другой способ сделать это, о котором я не знаю, или это просто не поддерживается вообще?


person Gustavo Guerra    schedule 15.04.2013    source источник
comment
Как примечание, вы можете преобразовать A * B -> C в A -> B -> C.   -  person JMCF125    schedule 17.04.2013


Ответы (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), но, надеюсь, это толчок в правильном направлении.

person Colin Bull    schedule 29.04.2013