Bob*_*Bob 5 .net c# lambda functional-programming
我最近询问了没有副作用的功能程序,并了解了这对于使并行化任务变得微不足道的意义.具体而言,"纯粹"功能使这一点变得微不足道,因为它们没有副作用.
我最近也在研究LINQ和lambda表达式,因为我在StackOverflow上涉及枚举的例子很多次.这让我想知道如果在C#中并行枚举或循环可以"更容易".
lambda表达式"纯粹"是否足以实现平凡的并行化?也许这取决于你在表达中做了什么,但它们能够足够纯粹吗?这样的事情在C#中理论上是可行的/微不足道的吗?:
例如,假设我在游戏循环中有一堆对象(因为我正在开发一个游戏并且正在考虑多线程的可能性)并且必须每帧都对它们做一些事情,上面的内容是否会微不足道关闭?看看IEnumerable似乎它只跟踪当前位置,所以我不确定我是否可以使用普通的泛型集合来将枚举分解为"块".
抱歉,这个问题.我使用上面的子弹而不是伪代码,因为我甚至不知道如何编写伪代码.我的.NET知识纯粹是简单的业务,我是代表和线程等的新手.我主要想知道上述方法是否适合追求,如果代理人/ lambdas不必担心何时它涉及到它们的并行化.
Eri*_*ert 17
首先,请注意,为了"纯粹",方法必须不仅没有副作用.在给出相同的参数时,它也必须始终返回相同的结果.因此,例如,"Math.Sin"方法是纯粹的.你喂12,它给你回罪(12),每次都是一样的.方法GetCurrentTime()即使没有副作用也不纯; 每次调用它时,它都会返回一个不同的值,无论你传入什么参数.
还要注意一个纯方法真的不应该抛出异常; 例外计算为我们目的的可观察副作用.
其次,是的,如果你可以推断一个方法的纯度,那么你可以做一些有趣的事情来自动并行化它.麻烦的是,几乎没有方法实际上是纯粹的.此外,假设你有一个纯粹的方法; 因为纯方法是备忘的完美候选者,并且由于memoization引入了副作用(它改变了缓存!),因此采用纯粹的方法然后使它们不纯,这是非常有吸引力的.
正如Joe Duffy所说,我们真正需要的是一种"驯服副作用"的方法.有些方法可以在方法周围绘制一个方框,并说"此方法不是无副作用的,但其副作用在此框之外是不可见的",然后使用该事实来驱动安全的自动并行化.
我想找出一些方法将这些概念添加到像C#这样的语言中,但这里完全是蓝天开放研究问题的东西; 没有任何意图或暗示的承诺.
Hen*_*man 13
Lambda 应该是纯粹的.然后,FrameWork提供自动并行化,只需.AsParallel
添加LINQ查询(PLINQ).
但它不是自动的或保证的,程序员有责任使它们保持纯净.
归档时间: |
|
查看次数: |
1034 次 |
最近记录: |