Ответ 1
В Haskell функции являются неотъемлемой частью языка, главным образом потому, что Haskell основан на Lambda Calculus.
В исчислении лямбда есть функции, которые имеют "свободные переменные", что означает, что они используют переменные, которые не передавались им как прямые параметры. Функции со свободными переменными - это то, что вы назвали бы "закрытием" в этом случае.
Поскольку функции со свободными переменными настолько распространены в LC, они также составляют неотъемлемую часть языка Haskell. Например, когда вы пишете это:
f a b c = a * b + c
... вы могли бы написать это, с тем же результатом:
f a b = \ c -> a * b + c
... или даже:
f a b = let product = a * b in \ c -> product + c
... дополнительные эквивалентные изменения:
f a = \ b -> let product = a * b in \ c -> product + c
Это потому, что Haskell по существу создает функции со свободными переменными всюду, и, таким образом, замыкания создаются все время. Некоторые из них могут быть оптимизированы компилятором, но можно с уверенностью предположить, что будет больше ограничений, чем вы могли бы когда-либо обнаружить самостоятельно.
Итак, не пытайтесь найти блокировки; они ничего особенного в Haskell и не используются все время.