是否有相当于部分申请返回值?

时间:2012-03-21 17:33:21

标签: c# clojure functional-programming naming partial-application

如果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 个答案:

答案 0 :(得分:2)

在函数式编程中,您可能使用函数组合来扩充或修改结果。对于您的示例,您只需使用常量函数组合现有函数,例如给定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 :(得分:1)

您可以编写一个为您创建匿名函数的方法。

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

虽然您的代码在技术上返回了args,但格式如下。

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

在任何一种情况下,您都可以将其传递给另一种方法,例如Method(Ignore(DoSomething));,或者您可以像Ignore(DoSomething)(1);一样自己调用它。