Haskell - 这是一个闭包吗?

时间:2015-10-23 15:18:20

标签: haskell closures

有一段源代码源于对another one of my questions

的回答
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"

我非常确定inf必须是一个闭包,因为它可以访问来自其封闭范围的变量,因为它使用传递给infFromPrefix的参数,但我不确定,因为基本上{ {1}}和infFromPrefix功能相同,inf仅允许 一个更简洁的定义。等价的定义是

inf

我是否正确,infFromPrefix rules prefix = prefix ++ case stripPrefix prefix (rules $ infFromPrefix rules prefix) of Just suffix -> suffix Nothing -> error "Substitution does not preserve prefix" 关闭了吗?

2 个答案:

答案 0 :(得分:10)

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

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

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

(如果您认为这是一个广泛的定义,请将其与原始的STG论文进行比较,其中甚至构造函数都被称为闭包。)

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

答案 1 :(得分:4)

基于Closures in programming上的Wiki文章,我认为可以说inf确实不是一个闭包:

  

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