返回值是否有等效的部分应用程序

本文关键字:应用程序 是否 返回值 | 更新日期: 2023-09-27 18:28:46

如果papply返回一个arity小于输入函数的函数,是否有类似的FP运算,返回一个无论输入函数的值如何都返回值的函数?如果是,是否存在C#等价物?

考虑一个返回void的C#函数,您希望将其转换为表达式,并且通过编写类似(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)

返回值是否有等效的部分应用程序

在函数式编程中,您可能会使用函数组合来扩充或修改结果。对于您的示例,您只需将现有函数与一个常量组合,例如给定f:

val f' = const 0 o f

其中o是函数组合(类似于数学),const 0创建一个总是返回0的常量函数(对于任何参数)。这些是标准的组合子,您可以定义如下:

fun (g o f) x = g (f x)
fun const x y = x

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

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);