lambda演算中的Eta抽象意味着以下。
A function `f` can be written as `\x -> f x`
在减少lambda表达式的同时,Eta是否有任何用途的抽象?它只是编写某些表达式的另一种方式吗?
答案 0 :(得分:1)
首先,为了澄清术语,转述 Haskell wiki 中 Eta conversion 文章中的引用(也包含上面 Will Ness 的评论):
<块引用>从 \x -> f x
转换为 f
会
构成一个eta 减少,并以相反的方式移动
将是 eta abstraction 或 expansion。术语eta 转化可以指任一方向的过程。
发现的用例摘要:
来自 Tacit programming 维基百科文章:
<块引用>默认编程,也叫point-free style,是一种编程 函数定义不识别参数的范式 (或“点”)他们操作。相反,定义仅仅是 编写其他函数
从 sth's answer 中借用 Haskell 示例(也显示了我在此处选择忽略的组合):
inc x = x + 1
可以改写为
inc = (+) 1
这是因为(在 yatima2975's reasoning 之后)inc x = x + 1
只是 \x -> (+) 1 x
的语法糖,所以
\x -> f x => f
\x -> ((+) 1) x => (+) 1
关于它的用法有一个 good thread on Stackoverflow。 (另见this repl.it snippet。)
使得在急切/严格语言中使用惰性求值成为可能。
从 Eta Expansion 上的 MLton 文档释义:
<块引用>Eta 扩展延迟 f
的计算,直到应用了周围的函数/lambda,并且每次应用该函数/lambda 时都会重新计算 f
。
有趣的 Stackoverflow 线程:Can every functional language be lazy?
我可能是错的,但我认为 thunking 或 thunks 的概念属于这里。来自the wikipedia article on thunks:
<块引用>在计算机编程中,thunk 是一个子程序,用于注入一个 附加计算到另一个子程序中。 Thunks 主要是 用于延迟计算直到需要其结果,或插入 其他子程序开始或结束的操作。
4.2 Variations on a Scheme — Lazy Evaluation (Structure and Interpretation of Computer Programs) 的 pdf 对 thunk 有非常详细的介绍(尽管没有出现过一次“lambda 演算”,但它是一个值得一读)。
(这篇论文看起来也很有趣,但还没有时间研究它:Thunks and the λ-Calculus。)
对这个话题完全无知,因此只提供来源:
来自Georg P. Loczewski's The Lambda Calculus:“在 Lambda Calculus、A++、SML、Haskell、Miranda 等‘懒惰’语言中。eta 转换-转换、抽象和归约等,主要在编译器中使用.(参见 [Jon87] 第 22 页。)"
[Jon87]
扩展为
西蒙·L·佩顿·琼斯
The Implementation of Functional Programming Languages
Prentice Hall International,赫特福德郡,HP2 7EZ,1987。
ISBN 0 13 453325 9.
search results for "eta" reduction abstraction expansion conversion "compiler" optimization
这是另一个我知之甚少的话题,它更具理论性,所以在这里:
来自 Lambda calculus 维基百科文章:
<块引用>η-reduction 表达了 extensionality 的思想,在这个 上下文是两个函数相同当且仅当它们给出 所有参数的结果相同。
其他一些来源:
Eta-conversion 上的 nLab 条目,深入探讨了它与外延的联系,以及它与 beta-conversion 的关系
理论计算机科学堆栈交换中的 What's the point of η-conversion in lambda calculus? 中的大量信息(但请注意:已接受答案的作者似乎对 eta 约简与可扩展性之间的关系的普遍看法持反对意见,所以一定要阅读整页。大部分都在我的脑海里,所以我没有意见。)
question above has been cross-posted to Math Exchange as well
说到“在我头上”的东西:这里是Conor McBride's take;我唯一明白的是 eta 转换在某些情况下可能会引起争议,但阅读他的回复是试图找出外星语言 (couldn't resist)
答案 1 :(得分:0)
eta减少/扩张只是法律规定的结果
f = g
必须是,对于任何x
f x = g x
反之亦然。
因此给出:
f x = (\y -> f y) x
我们通过beta减少右侧来获得
f x = f x
必须是真的。因此,我们可以得出结论
f = \y -> f y