有一段源代码源自 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
的参数,但我不确定,因为本质上 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"
我说得对吗,inf
是一个闭包吗?
最佳答案
我同意 Lennart 和 Daniel 的观点,即闭包是一个特定于实现的术语,并且一般来说没有明确定义。此外,除了实现问题之外,我没有听到 Haskellers 过多谈论闭包。当使用其他语言的程序员随意谈论“闭包”时,他们通常指的是我们所说的“lambda”。 (如“该语言有闭包吗?”。)
无论如何,我们来谈谈 GHC。
GHC(或者,更准确地说,STG)调用闭包任何不是构造函数应用程序的堆对象。
(如果您认为这是一个广泛的定义,请将其与原始的 STG 论文进行比较,其中甚至构造函数也被称为闭包。)
你的inf
肯定是一个STG闭包;它是一个将在堆上分配并返回给调用者的 thunk。
关于Haskell - 这是一个闭包吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33305935/