在lambda演算中的Eta抽象

时间:2016-11-15 19:05:33

标签: lambda-calculus

lambda演算中的Eta抽象意味着以下。

A function `f` can be written as `\x -> f x` 

在减少lambda表达式的同时,Eta是否有任何用途的抽象?它只是编写某些表达式的另一种方式吗?

2 个答案:

答案 0 :(得分:1)

首先,为了澄清术语,转述 Haskell wiki 中 Eta conversion 文章中的引用(也包含上面 Will Ness 的评论):

<块引用>

\x -> f x 转换为 f 会 构成一个eta 减少,并以相反的方式移动 将是 eta abstractionexpansion。术语eta 转化可以指任一方向的过程。

  • 广泛使用 η-reduction 会导致 Pointfree programming
  • 它通常也用于某些编译时优化。

发现的用例摘要:

  1. 无点(风格)编程
  2. 允许在使用严格/急切评估策略的语言中进行惰性评估
  3. 编译时优化
  4. 扩展性

1.无点(风格)编程

来自 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。)

2.允许在使用严格/急切评估策略的语言中进行惰性评估

使得在急切/严格语言中使用惰性求值成为可能。

Eta Expansion 上的 MLton 文档释义:

<块引用>

Eta 扩展延迟 f 的计算,直到应用了周围的函数/lambda,并且每次应用该函数/lambda 时都会重新计算 f

有趣的 Stackoverflow 线程:Can every functional language be lazy?

2.1 重击

我可能是错的,但我认为 thunkingthunks 的概念属于这里。来自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。)

3.编译时优化

对这个话题完全无知,因此只提供来源:

4. Extensionality

这是另一个我知之甚少的话题,它更具理论性,所以在这里:

来自 Lambda calculus 维基百科文章:

<块引用>

η-reduction 表达了 extensionality 的思想,在这个 上下文是两个函数相同当且仅当它们给出 所有参数的结果相同。

其他一些来源:

答案 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