有一段源代码源于对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"
关闭了吗?
答案 0 :(得分:10)
我同意Lennart和Daniel的观点,即闭包是一个特定于实现的术语,并不是一般定义明确的术语。此外,我没有听到Haskellers在实施问题之外谈论关闭很多事情;当其他语言的程序员随便谈论“闭包”时,它们通常意味着我们称之为“lambdas”。 (如“那种语言有封闭吗?”。)
无论如何,我们来谈谈GHC。
GHC(或者,更确切地说,STG)调用闭包任何不是构造函数应用程序的堆对象。
(如果您认为这是一个广泛的定义,请将其与原始的STG论文进行比较,其中甚至构造函数都被称为闭包。)
你的inf
肯定是STG关闭;它是一个将在堆上分配并返回给调用者的thunk。
答案 1 :(得分:4)
基于Closures in programming上的Wiki文章,我认为可以说inf
确实不是一个闭包:
特别注意嵌套函数定义本身并不是闭包:它们有一个自由变量,它尚未绑定。只有在使用参数值计算封闭函数时,才会嵌套函数绑定的自由变量,创建一个闭包,然后从封闭函数返回。