Haskell - 这是一个闭包吗?

Fil*_*erg 7 closures haskell

有一段源代码源于对我的另一个问题的回答,

infFromPrefix :: Eq a => ([a] -> [a]) -> [a] -> [a] 
infFromPrefix rules prefix = inf where
    inf = prefix ++ case stripPrefix prefix (rules inf) of
        Just suffix -> suffix
        Nothing     -> error "Substitution does not preserve prefix"
Run Code Online (Sandbox Code Playgroud)

我在哪里敢肯定,inf一定是一个封闭物,它可以访问来自于它使用传递给参数的意义及其封闭的范围变量infFromPrefix,但由于本质上是不确定infFromPrefixinf相同的功能,inf只允许一个更简洁的定义.等价的定义是

infFromPrefix rules prefix = prefix ++ case stripPrefix prefix (rules $ infFromPrefix rules prefix) of
        Just suffix -> suffix
        Nothing     -> error "Substitution does not preserve prefix"
Run Code Online (Sandbox Code Playgroud)

我是正确的,是inf关闭?

Rom*_*aka 10

我同意Lennart和Daniel的观点,即闭包是一个特定于实现的术语,并不是一般定义明确的.此外,我没有听到Haskellers在实施问题之外谈论关闭很多事情; 当其他语言的程序员随便谈论"闭包"时,它们通常意味着我们称之为"lambdas".(如"那种语言有封闭吗?".)

无论如何,我们来谈谈GHC.

GHC(或更确切地说,STG)调用闭包任何不是构造函数应用程序的堆对象.

(如果您认为这是一个广泛的定义,请将其与原始STG文件进行比较,即使构造函数被称为闭包.)

inf肯定是一个STG关闭; 它是一个将在堆上分配并返回给调用者的thunk.

  • @ErikAllik也许问题的一部分是这里的人(以及维基百科文章中的人)并没有注意静态对象​​(语言中的语法块)与动态对象之间的区别 - 在那里构建和检查的东西运行.要说'inf`本身不是闭包在技术上是正确的,因为它是一个静态对象,只有动态对象可以是闭包; 但是要说在运行时,当调用`infFromPrefix`似乎也是正确的时,表达式`inf`会变成一个闭包. (2认同)

Eri*_*lun 5

根据Wiki上有关编程中的闭包的文章,我认为可以说inf确实不是闭包:

特别要注意的是,嵌套函数定义本身不是闭包:它们具有一个尚未绑定的自由变量。只有在用参数的值对封闭函数进行求值后,嵌套函数绑定的自由变量才会创建封闭,然后从封闭函数返回封闭函数。

  • “甚至一个值都可以看作是没有参数的函数。” 不是,不是 (2认同)