Я читаю «Начни программировать с Haskell» от Уилла Курта. В конце Урока 3, посвященного лексической области видимости, автор пишет:
Использование выражения let
и лямбда-функции - это не совсем одно и то же. Например, следующий код вызовет ошибку, если вы попытаетесь его запустить:
counter x = let x = x + 1 in let x = x + 1 in x
Чтобы доказать, что let
и лямбда не идентичны, перепишите функцию счетчика точно так, как здесь, но используйте вложенные лямбды вместо let
.
Вот мое решение, которое работает так, как я ожидал:
counterLambda x = (\x -> (\x -> x) (x + 1)) (x + 1)
-- counterLambda 2 == 4
Однако, как предлагает автор, если я запустил counter 2
в ghci, он зависнет навсегда (с использованием GH C 8.8.3).
Что происходит под капотом?
PS: Это работает, когда я правильно называю переменные.
counter x = let a = x + 1 in let b = a + 1 in b
-- counter 2 == 4