首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >哈斯克尔-结束了吗?

哈斯克尔-结束了吗?
EN

Stack Overflow用户
提问于 2015-10-23 07:18:19
回答 2查看 605关注 0票数 7

有一段源代码来源于对我的另一个问题的回答,

代码语言:javascript
运行
AI代码解释
复制
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只允许更简洁的定义。相应的定义是

代码语言:javascript
运行
AI代码解释
复制
infFromPrefix rules prefix = prefix ++ case stripPrefix prefix (rules $ infFromPrefix rules prefix) of
        Just suffix -> suffix
        Nothing     -> error "Substitution does not preserve prefix"

我说的对吗,inf是个终结吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-23 07:42:02

基于Wiki在程序设计中的闭包上的文章,我认为可以说,inf确实不是一个闭包:

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

票数 5
EN

Stack Overflow用户

发布于 2015-10-23 09:10:45

我同意Lennart和Daniel的观点,即闭包是一个特定于实现的术语,在一般情况下并没有很好的定义。此外,除了实现问题之外,我没有听到Haskellers过多地谈论闭包;当其他语言的程序员随意谈论“闭包”时,他们通常是指我们所说的"lambdas“。(如“该语言有闭包吗?”)

不管怎么说,让我们谈谈GHC。

GHC (或者更准确地说,斯泰格)调用一个闭包--任何不是构造函数应用程序的堆对象。

(如果您认为这是一个宽泛的定义,请将其与最初的斯泰格文件进行比较,其中甚至连构造函数都被称为闭包。)

您的inf当然是一个STG闭包;它将在堆上分配并返回给调用者。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33305935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档