C# lambda表达式/委托是否为C;纯粹的;,或者他们可能是?
我了解了没有副作用的函数程序,并了解了这对于使并行任务变得简单意味着什么。具体来说,“纯”函数使这变得微不足道,因为它们没有副作用 我最近还研究了LINQ和lambda表达式,因为我在这里多次遇到涉及枚举的StackOverflow示例。这让我想知道,在C#now中,并行化枚举或循环是否“更容易” lambda表达式是否“纯净”到足以实现琐碎的并行化?也许这取决于你对这个表达式做了什么,但它们是否足够纯净呢?在C#中,这样的事情在理论上是可能的/微不足道的吗C# lambda表达式/委托是否为C;纯粹的;,或者他们可能是?,c#,.net,functional-programming,lambda,C#,.net,Functional Programming,Lambda,我了解了没有副作用的函数程序,并了解了这对于使并行任务变得简单意味着什么。具体来说,“纯”函数使这变得微不足道,因为它们没有副作用 我最近还研究了LINQ和lambda表达式,因为我在这里多次遇到涉及枚举的StackOverflow示例。这让我想知道,在C#now中,并行化枚举或循环是否“更容易” lambda表达式是否“纯净”到足以实现琐碎的并行化?也许这取决于你对这个表达式做了什么,但它们是否足够纯净呢?在C#中,这样的事情在理论上是可能的/微不足道的吗 将循环分解成块 运行一个线程来循环
- 将循环分解成块
- 运行一个线程来循环每个块
- 运行一个函数,该函数使用 每个线程的当前环路位置
.aspallel
,提供了自动并行化
但是它不是自动的或保证的,程序员有责任使它们保持纯净。lambda是否纯净取决于它在做什么。作为一个概念,它既不纯粹也不不纯 例如:以下lambda表达式是不纯的,因为它在主体中读取和写入单个变量。并行运行会创建竞争条件
var i = 0;
Func<bool> del = () => {
if ( i == 42 ) { return true; }
else ( i++ ) { return false; }
};
var i=0;
Func del=()=>{
如果(i==42){返回true;}
else(i++){return false;}
};
相反,下面的委托是纯的,没有竞争条件
Func<bool> del = () => true;
Func del=()=>true;
至于循环部分,您也可以使用Parallel.for
和Parallel.ForEach
作为关于游戏中对象的示例。这也是.net 4的一部分,但您可以下载它。首先,请注意,为了“纯粹”,一种方法不仅必须没有副作用。当给定相同的参数时,它还必须始终返回相同的结果。例如,“Math.Sin”方法是纯粹的。你在12岁时进食,它会给你带来罪恶(12),每次都是一样的。方法GetCurrentTime()即使没有副作用也不是纯粹的;无论传入什么参数,每次调用时它都返回不同的值
还要注意,纯方法确实不应该抛出异常;出于我们的目的,异常被视为可观察到的副作用
第二,是的,如果你能对一个方法的纯度进行推理,那么你就可以做一些有趣的事情来自动将它并行化。问题是,几乎没有一种方法是纯粹的。此外,假设你有一个纯方法;由于纯方法是记忆化的完美候选者,而且由于记忆化会带来副作用(它会使缓存发生变异!),因此,采用本应是纯方法的方法,然后使其变得不纯净,这是非常有吸引力的
正如乔·达菲所说,我们真正需要的是某种“抑制副作用”的方法。在一个方法周围画一个框,说“这个方法不是没有副作用的,但是它的副作用在框外是看不见的”,然后利用这个事实来驱动安全的自动并行化
我很想找到一些方法,将这些概念添加到像C#这样的语言中,但这里的问题完全是空中楼阁的开放式研究问题;没有意图或暗示的承诺。有一篇13部分的文章讨论了.NET 4.0中新的并行性支持。第7部分还包括对LINQ和PLINQ的讨论。这是一本很好的读物,所以请查看它AsParallel?那是什么?C#4?还是单独下载?是的,对不起。PLINQ是.NET4的一部分,3.5+1函数式编程也有一个版本(beta?),它赋予程序员更多的责任。识别可以并行执行的代码块就是其中之一。出于好奇,如果你试图运行不完全使用“AsParallel”的代码,会发生什么情况?@Joan:常见的东西:竞争条件