Есть ли эквивалент частичного применения для возвращаемых значений? - PullRequest
1 голос
/ 21 марта 2012

Если papply возвращает функцию с меньшей арностью, чем функция ввода, существует ли аналогичная операция FP с функцией, которая возвращает значение независимо от значения функции ввода?Если да, есть ли эквивалент C #?

Рассмотрим функцию C #, которая возвращает void, которую вы хотите преобразовать в выражение, и вы много раз это делали, написав обертку анонимной функции, такую ​​как (args) => f(args); return null;.

В C #,

public Func<T1, T2, ..., T8, TResult> WhatIsMyName<T1, T2, ..., T8, TResult> (Action<T1, T2, ..., T8> action, TResult value = default(TResult))
{
    return (t) => { action(t); return value; }
}

, который в идеале вы бы назвали как FP.WhatIsMyName(voidfunc), и поэтому избегайте необходимости разыгрывать .

ВClojure,

(defn whatismyname? [f x] 
  (f)
  x)

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

В функциональном программировании вы, вероятно, использовали бы композицию функций для дополнения или изменения результата.Для вашего примера вы просто создаете существующую функцию с константой, например, учитывая f:

val f' = const 0 o f

, где o - это композиция функций (как в математике), а const 0 создает постоянную функциювсегда возвращает 0 (для любого аргумента).Это стандартные комбинаторы, которые вы можете определить следующим образом:

fun (g o f) x = g (f x)
fun const x y = x
1 голос
/ 21 марта 2012

Вы можете написать метод, который создает анонимную функцию для вас.

public Action<T> Ignore<T,TResult>(Func<T,TResult> func)
{
    return (args) => { func(args); return; }
}

Хотя ваш код технически возвращает аргументы, это будет следующий формат.

public Func<T,T> Ignore<T,TResult>(Func<T,TResult> func)
{
    return (args) => { func(args); return args; }
}

В любом случае вы можете передать его в другой метод, подобный этому Method(Ignore(DoSomething));, или вы можете назвать его самим так Ignore(DoSomething)(1);.

...