Last updated on 2020年11月21日 at 下午4:12

python 不支持语言层面的惰性求值,只有 map 函数等位置才会出现局部的惰性。

参考

(译)Haskell中的WHNF – 简书

理解本文需要上文的基础知识。

正文

w = lambda f: f(f)
fac1 = lambda f: lambda x: 1 if not x else x*f(x-1)

Y = lambda f: w(lambda x: f(lambda *args: w(x)(*args)))
fac = Y(fac1)
    = w(lambda x: fac1(lambda *args: w(x)(*args)))
    = (lambda x: fac1(lambda *args: w(x)(*args)))(lambda x: fac1(lambda *args: w(x)(*args)))
    = fac1(lambda *args: w(lambda x: fac1(lambda *args: w(x)(*args)))(*args))
    = lambda x: 1 if not x else x*(lambda *args: w(lambda x: fac1(lambda *args: w(x)(*args)))(*args))(x-1)
    = lambda x: 1 if not x else x*w(lambda x: fac1(lambda *args: w(x)(*args)))(x-1)
Y = lambda f: w(lambda x: f(w(x)))
fac = Y(fac1)
    = w(lambda x: fac1(w(x))) # 函数,不可求值
    = (lambda x: fac1(w(x)))(lambda x: fac1(w(x)))
    = fac1(w(lambda x: fac1(w(x))))
   != lambda x: 1 if not x else x*w(lambda x: fac1(w(x)))(x-1) # 上面四行定义时报错,这行运行时报错

如果能理解最后一个不等号,本文就到此为止了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注