1

如果 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; }
}

理想情况下,您可以将其称为 like FP.WhatIsMyName(voidfunc),从而避免强制转换.

在 Clojure 中,

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

2 回答 2

2

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

val f' = const 0 o f

whereo是函数组合(如数学)并const 0创建一个始终返回 0 的常量函数(对于任何参数)。这些是标准组合器,您可以定义如下:

fun (g o f) x = g (f x)
fun const x y = x
于 2012-03-21T17:41:39.823 回答
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);

于 2012-03-21T17:42:08.050 回答