在 Haskell 中使用匿名函数

Using anonymous functions in Haskell

提问人:min_2_max 提问时间:10/31/2018 更新时间:10/31/2018 访问量:360

问:

我正在阅读 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 代码是如何工作的?

Haskell 闭包匿名 函数

评论

1赞 Alec 10/31/2018
getAtrribute obj == obj (\x -> x) == (simpleObject 5) (\x -> x) == (\message -> message 5) (\x -> x) == (\x -> x) 5 == 5
0赞 min_2_max 10/31/2018
啊......这很有帮助!我被挂在倒数第二个过渡上。非常感谢!
0赞 Dan Robertson 10/31/2018
这是我最近第二次看到这种奇怪的技术(第一次是在 stackoverflow.com/q/53023885/4942760 )。我认为这个具体案例根本没有意义。我能想到的唯一半感性的用法是闭包的记录,以实现可怜的人 gadts(不是必需的,因为存在 gadts)或允许某种类似 oo 的对象/接口(但为什么不使用类型类?这种技术与直接使用值没有什么不同(同构是一种方式和另一种方式)。这应该有什么用?($id)flip ($)
0赞 chi 11/1/2018
@DanRobertson我不认为它有任何目的,但它只是一个关于关闭的练习。意识到这种同构的存在也可以是另一种练习。它主要是关于学习/理解,而不是本身真正有用(IMO)。

答:

2赞 chi 10/31/2018 #1

我们可以评估表达式,用它自己的定义替换每个定义的标识符。

getAtrribute obj
= { def. getAttribute }
obj (\x -> x)
= { def. obj. }
simpleObject 5 (\x -> x)
= { def. simpleObject }
(\message -> message 5) (\x -> x)
= { beta reduction }
(\x -> x) 5
= { beta reduction }
5

评论

0赞 min_2_max 11/1/2018
谢谢!评论者 Alec 在上面发布了类似的技术,该技术也澄清了代码。