Подтвердить что ты не робот

Закрытие (в Haskell)

Для меня закрытие - это (вложенная?) функция с совместными данными.

Когда вы пишете программное обеспечение в Haskell и просматриваете его позже, вы часто обнаруживаете закрытие, которое вы создали непреднамеренно.

Я не совсем понимаю это для себя. В каких ситуациях я намеренно хочу закодировать замыкания? В конце концов, во всех примерах я нахожу, что количество размещенных данных тривиально/мало, и поэтому мне это не совсем кажется, как если бы на практике это оправдывало их (намеренное) создание. Есть ли какой-либо модуль Haskell, который бы поддерживал меня в намеренно создающих закрытие и, например, сохраняя их на карте?

4b9b3361

Ответ 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 и не используются все время.

Ответ 2

Как правило, если мне нужно предварительно компилировать таблицы или что-то для функции или есть функция, требующая большого количества данных, да, это будет сделано как закрытие. Например, на моей домашней работе по ИИ на днях я написал то, что узнал из множества образцов, а затем вытащил функцию (Point -> Bool), но эта функция должна была зависеть от большого количества данных, которые я накопил из процесс обучения.