Haskell - 这是一个闭包吗?

标签 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 的参数,但我不确定,因为本质上 infFromPrefixinf 是相同的函数,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/

相关文章:

haskell - Yesod 可编辑表

javascript - javascript 中的闭包是否与 C++ 中的类实例(具有私有(private)成员和公共(public)方法)相当?

php - 从祖先列表构建树的最简单方法

grails - 在grails Controller 中关闭不接受参数

JavaScript 作用域/闭包 : Why can I access internal vars here?

javascript - 如何在高阶 javascript 函数中执行变量捕获?

haskell - Haskell LLVM-General 代码生成中的 Segfault

windows - Windows 安装程序上的 Haskell

haskell - Haskell 中存在类型的编译问题

string - 字符串函数中的 Haskell 字符