我想了解let
绑定在 Haskell 中是如何工作的(或者可能是 lambda 演算,如果 Haskell 实现不同?)
我从阅读Write you a Haskell中了解到,这对单个let
绑定有效。
let x = y in e == (\x -> e) y
这对我来说很有意义,因为它与绑定在 lambda 演算中的工作方式是一致的。我感到困惑的是使用多个let
绑定,其中一个绑定可以引用上面的绑定。我将提供一个简单的例子。
原始代码:
let times x y = x * y
square x = times x x
in square 5
我对实现的猜测:
(\square times -> square 5) (\x -> times x x) (\x -> x * x)
这似乎不起作用,因为times
在 lambda 调用 square 时未定义。然而,这可以通过这个实现来解决:
(\square -> square 5) ((\times x -> times x x) (\x -> x * x))
这是实现此绑定的正确方法,至少在 lambda 演算中是这样吗?