小编見崎鳴*_*見崎鳴的帖子

完全懒惰的lambda浮动通行证?

我正在阅读实现函数式语言:一个教程,并在实现完全懒惰的lambda提升的浮动传递时遇到了问题.

我想描述浮动如何使这个问题清楚,如果你熟悉它,只需跳到下面的问题.

该概念在本文的第246页介绍,主要在第256-257页实施.

let(rec)表达的情况下,它说:

我们必须在let(rec)表达本身之前放置右侧的浮动定义,因为右侧可能依赖于它们.

例如:

\a ->
  let f = \b -> b + (let $mfe = a * a in $mfe)
  in f
Run Code Online (Sandbox Code Playgroud)

变量$mfe是一个最大自由表达式(MFE),它通过前一次传递识别,当处理let f表达式时,我们f作为一个组浮出并附加到它[(1, [($mfe, a * a)])],这是从右边获得的let f.这里,第一个组件1表示组的自由级别.

当回溯到\a -> f抽象,我们发现,无论是$mfef被它约束,因此我们应该在这里安装它们:

\a ->
  let $mfe = a * a
  in
    let f = \b -> b …
Run Code Online (Sandbox Code Playgroud)

haskell functional-programming lambda-calculus program-transformation

10
推荐指数
0
解决办法
177
查看次数