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

时间:2016-01-05 11:44:54

标签: haskell functional-programming lambda-calculus program-transformation

我正在阅读implementing functional languages: a tutorial,并且在实现完全懒惰的lambda提升的浮动传递时遇到了问题。

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

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

如果let(rec)表达,则表示:

  

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

例如:

\a ->
  let f = \b -> b + (let $mfe = a * a in $mfe)
  in f

变量$mfe最大自由表达式(MFE),它通过上一次传递标识,在处理let f表达式时,我们将f浮动为一组并将其附加到[(1, [($mfe, a * a)])],该let f是从1的右侧获得的。此处,第一个组件\a -> f表示该组的免费级别

当回溯到$mfe抽象时,我们发现f\a -> let $mfe = a * a in let f = \b -> b + $mfe in f 都受其约束,因此我们应该在这里安装它们:

f = \x -> \y ->
  letrec
    a = \p -> cons p (b x)
    b = \q -> cons q (a y)
  in pair (a 1) (b 2)

问题

假设我们有这样的程序:

b x

a yy免费级别将为2,因为cons p (b x)的级别为2,且它们位于同一组中。

cons q (a y)b x免费级别为3,因此a yf = \x -> \y -> let $ay = a y -- `a` is not defined yet! in let $bx = b x -- and `b` in letrec a = \p -> cons p $bx b = \q -> cons q $ay in pair (a 1) (b 2) 将被标记为MFE(我是否犯了错误)这里吗?)。

使用SPJ给出的算法,程序将转换为:

let(rec)

我认为let(rec)表达式右侧的MFE应该f = \x -> \y -> letrec $ay = a y $bx = b x a = \p -> cons p $bx b = \q -> cons q $ay in pair (a 1) (b 2) 范围内,只要它引用左侧,并且正确结果可能是这样的:

for %%i in (all/*.*) do for /f %%u in ("%%~ni") do (
   echo "%%i" "%%u_NewFile_%%~xi"
)

纸张错了吗?或者我只是误解了它。

0 个答案:

没有答案