[…] they allow you to create units of
work,which each have their own copy
of the stack,and don’t step on each
others toes as a result. What’s more,
you can pass these units around like
they are values,when in actual fact
they contain a whole stack of values
(pun intended),and executable code to
perform some operation.
现在,我不是在讨论闭包的有用性,也可能是共享内存模型中的并发编程,但是与仅作用于本地数据(或进程,或者actor,或……)的线程的区别是什么? ?
作为没有调度程序的线程的并发编程,它本身不是一个闭包吗?
什么是关闭具有非局部副作用?
解决方法
我最喜欢的高阶函数的介绍是“Why functional programming matters”,我不会尝试在这里展示一个糟糕的复制品.
因此,如果你要在for循环中执行闭包,那么使用闭包不会免费提供并行性,例如
for (int i = 0; i < numElements; i++) { result[i] = closure(inputs[i],i); }
因为语言无法判断闭包(a,b)是否以某种方式改变了结果或输入数组中的其他值.但是具有高阶函数(如map)的语言指定传递给map的函数不应查看或更改输入中的其他值,并防止它影响其他结果.因此,类似下面的代码(在函数式语言中很常见)可以为您并行化,而无需创建工作线程池并将闭包交给它们:
results = map(closure,inputs,[0..numElements-1]);
在这些语言中,闭包消除了在短片代码中声明新函数的痛苦.这使得使用高阶函数更有趣.
下面的Haskell代码定义了一个函数f,它接受一个数字列表并返回一个列表,其中每个输入i被替换为2i 1.通过保存创建函数来计算2i 1的麻烦这是1行代码而不是2行.
f nums = map (\i -> 2*i+1) nums
再次,请参阅“Why functional programming matters”以获得有关如何扩展到实际代码库的强有力论据.