如何在函数式语言中使用闭包

RHS*_*ger 3 closures functional-programming

出于某种原因,我倾向于将闭包与函数语言相关联.我相信这主要是因为我所看到的关于闭包的讨论几乎总是在一个专注于函数式编程的环境中.话虽这么说,我能想到的闭包的实际用途本质上都是非功能性的.

在函数式语言中是否存在闭包的实际用法,或者在我的脑海中是否存在关联,主要是因为闭包用于以函数式编程语言(一流函数,currying等)常见的样式编程?

编辑:我应该澄清一下,我指的是实际的函数式语言,这意味着我正在寻找保持参照透明度的用法(对于相同的输入,你得到相同的输出).

编辑:添加到目前为止发布内容的摘要:

  1. 闭包用于实现部分评估.具体来说,对于带有两个参数的函数,可以使用一个参数调用它,这会导致它返回一个带有一个参数的函数.通常,该第二函数"存储"传递给它的第一个值的方法是闭包.
  2. 可以使用闭包来实现对象.返回一个关闭了许多变量的函数,然后可以像对象属性一样使用它们.函数本身可以返回更多方法,这些方法充当对象方法,也可以访问这些变量.假设未修改变量,则保持参照透明度.

Bru*_*eis 6

我在Javascript代码中使用了大量的闭包(这是一种非常实用的语言 - 我开玩笑说它是带有C服装的Scheme).它们提供了对函数私有的数据封装.

最无处不在的例子:

var generateId = function() {
    var id = 0;
    return function() {
        return id++;
    }
}();
window.alert(generateId());
window.alert(generateId());
Run Code Online (Sandbox Code Playgroud)

但那是Javascript关闭的问候世界.然而,还有更多的实际用途.

最近,在我的工作中,我需要用滑块编写一个简单的照片库.它做的事情如下:

var slide = function() {
    var photoSize = ...
    var ... // lots of calculations of sizes, distances to scroll, etc
    var scroll = function(direction, amout) {
        // here we use some of the variables defined just above
        // (it will be returned, therefore it is a closure)
    };
    return {
        up: function() { scroll(1, photoSize); },
        down: function() { scroll(-1, photoSize); }
    }
}();

slide.up();
// actually the line above would have to be associated to some
// event handler to be useful
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我使用闭包来隐藏所有向上向下滚动逻辑,并且有一个非常语义的代码:在Javascript中,"向上滑动"你会写slide.up().