【问题标题】:Using anonymous functions in Haskell在 Haskell 中使用匿名函数
【发布时间】: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


【解决方案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

【讨论】:

  • 谢谢!评论者 Alec 在上面发布了一个类似的技术,它也澄清了代码。
猜你喜欢
  • 2019-10-08
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 2021-01-15
  • 2014-09-11
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
相关资源
最近更新 更多