我正在将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实现的人,它用于副作用,返回自己的列表,并将列表的每个值作为参数进行闭包迭代和传递。
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
发布于 2014-10-17 19:41:36
您需要一个Action<T>而不是Action。您也可以直接调用它而不是使用DynamicInvoke。
public static void Each<T>(this IEnumberable<T> list, Action<T> a)
{
foreach (var result in list)
{
a(result);
}
}https://stackoverflow.com/questions/26432271
复制相似问题