有一段源代码源于对我的另一个问题的回答,
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
,但由于本质上是不确定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"
Run Code Online (Sandbox Code Playgroud)
我是正确的,是inf
关闭?
Rom*_*aka 10
我同意Lennart和Daniel的观点,即闭包是一个特定于实现的术语,并不是一般定义明确的.此外,我没有听到Haskellers在实施问题之外谈论关闭很多事情; 当其他语言的程序员随便谈论"闭包"时,它们通常意味着我们称之为"lambdas".(如"那种语言有封闭吗?".)
无论如何,我们来谈谈GHC.
GHC(或更确切地说,STG)调用闭包任何不是构造函数应用程序的堆对象.
(如果您认为这是一个广泛的定义,请将其与原始STG文件进行比较,即使构造函数被称为闭包.)
你inf
肯定是一个STG关闭; 它是一个将在堆上分配并返回给调用者的thunk.