【发布时间】:2019-04-04 02:15:03
【问题描述】:
我正在阅读 Get Programming with Haskell 以了解函数式编程。在第 10 课中,作者讨论了使用函数式编程使用闭包创建简单对象。到目前为止,本书的主题包括高阶函数、lambda 函数和闭包。
他的描述大致如下:
simpleObject intAttribute= \message -> message intAttribute
simpleObject 返回一个闭包,它实际上存储了 intAttribute。闭包将函数作为参数并提供 intAttribute 作为参数。例如(我的):
obj = simpleObject 5
doubleIt x = 2 * x
obj doubleIt (returns 10)
到目前为止,我想我已经很清楚了。
然后作者描述了一个类似如下的访问器:
getAttribute y = y (\x -> x)
getAtrribute obj (returns 5)
代码按预期工作,返回捕获的 intAttribute。这就是我迷路的地方。 getAttribute 代码是如何工作的?
【问题讨论】:
-
getAtrribute obj == obj (\x -> x) == (simpleObject 5) (\x -> x) == (\message -> message 5) (\x -> x) == (\x -> x) 5 == 5 -
啊...帮助很大!我在倒数第二个过渡时挂断了电话。非常感谢!
-
这是我最近第二次看到这种奇怪的技术(首先在stackoverflow.com/q/53023885/4942760)。我认为这个具体案例根本没有意义。我能想到的唯一半有意义的用法是闭包的记录,要么实现可怜的 mans gadts(因为 gadts 存在,所以没有必要)或允许某种 oo 像对象/接口(但为什么不使用类型类?)与直接使用值不同(同构是
($id)在一种方式和flip ($)另一种方式)。这应该有什么用? -
@DanRobertson 我认为它没有任何目的,但这只是一个关于闭包的练习。意识到存在这种同构也可以是另一种练习。它主要是关于学习/理解,而不是真正有用(IMO)。
标签: haskell closures anonymous-function