c# - 混合扩展方法、泛型和 lambda 表达式

标签 c# haskell lambda

我正在将 Haskell 的/LiveScript each 函数移植到 C#,但我遇到了一些麻烦。这个函数的签名是 (a → Undefined) → [a] → [a] 我在 Haskell 或 LS 中使用类型和 lambda 表达式工作得很好,但 C# 让我感到困惑。这个扩展方法的最终使用应该是:

String[] str = { "Haskell", "Scheme", "Perl", "Clojure", "LiveScript", "Erlang" };
str.Each((x) => Console.WriteLine(x));

并且,有了这个,我的输出应该是:

Haskell
Scheme
Perl
Clojure
LiveScript
Erlang

我目前对each 的实现是:

public static void Each<T>(this IEnumberable<T> list, Action closure)
{
  foreach (var result in list)
  {
    Delegate d = closure;
    object[] parameters = { result };
    d.DynamicInvoke(parameters);
  }
}

问题是我无法在我的 lambda 表达式中传递参数。我做不到 (x) => ...

如何将参数传递给 lambda 表达式?在 Haskell 中使用一等函数比在 C# 中更容易。我只是很困惑。

对于那些不知道 Each 实现的人,它用于副作用,返回自己的列表并应用闭包迭代并将列表的每个值作为参数传递。它在 PHP 中的实现应该是:

public static function each($func) {
  // where $this->value is a list
  foreach ($this->value as $xs) {
    $func($xs);
  }
  return $this->value;
  // Or return $this; in case of method-chaining
}

有人可以帮助我吗?我搜索了它,但对我来说并不清楚。 [而且我不想使用 Linq]

最佳答案

你需要一个 Action<T>而不是 Action .您也可以直接调用它而不是使用 DynamicInvoke :

public static void Each<T>(this IEnumberable<T> list, Action<T> a)
{
  foreach (var result in list)
  {
    a(result);
  }
}

关于c# - 混合扩展方法、泛型和 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26432271/

相关文章:

c# - 使用 WMI 挂载网络驱动器

c# - MVC Web API 2 - 在操作上使用自定义属性

haskell - 如何在 Haskell 中对手动分配的数据进行垃圾收集?

haskell - 对 (fmap length Just) [1,1,1,1] 与 fmap length $ Just [1,1,1,1] 感到困惑

java - 使用 Java8 将一个对象映射到另一个(DTO)

c# - 使用 Controller 返回的值填充图表

c# - 如何阅读所有 Feed 项目?

javascript - 如何在严格评估的语言中实现 protected 递归?

Java 8 Lambda 不工作?

java - BinaryOperator 的身份