Я хочу понять, как работают привязки let
в Haskell (или, может быть, лямбда-исчисление, если реализация Haskell отличается?)
Я понял из чтения Написать вам Haskell, что это действительно для одной привязки let
.
let x = y in e == (\x -> e) y
Это имеет смысл для меня, так как это согласуется с тем, как привязки работают в лямбда-исчислении. Меня смущает использование нескольких привязок 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
не определено, когда квадрат вызывается лямбдой. Однако это может быть решено с помощью этой реализации:
(\square -> square 5) ((\times x -> times x x) (\x -> x * x))
Является ли это правильным способом реализации этой привязки, по крайней мере, в лямбда-исчислении?
let times x y = x * y ...
, иначе это не имеет особого смысла. - person karakfa   schedule 06.01.2019let
в Haskell - это неlet
, этоletrec
. - person Will Ness   schedule 07.01.2019let
на самом делеletrec
, значит ли это, чтоfix
применяется ко всем привязкам или только к рекурсивным? - person Ben DalFavero   schedule 07.01.2019