Закрытия (в Хаскеле) - PullRequest
       32

Закрытия (в Хаскеле)

14 голосов
/ 01 февраля 2012

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

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

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

Ответы [ 2 ]

26 голосов
/ 01 февраля 2012

В Haskell функции являются неотъемлемой частью языка, главным образом потому, что Haskell основан на лямбда-исчислении .

В лямбда-исчислении есть функции, которые имеют «свободные переменные», что означает, что они используют переменные, которые не были переданы им в качестве прямых параметров. Функции со свободными переменными - это то, что вы бы назвали «замыканиями» в этом случае.

Поскольку функции со свободными переменными так распространены в 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 по существу создает функции со свободными переменными везде , и, таким образом, замыкания создаются постоянно. Некоторые из них могут быть оптимизированы компилятором, но можно предположить, что будет использовано больше замыканий, чем вы когда-либо сможете обнаружить самостоятельно.

Итак, не пытайтесь найти замыкания; в Хаскеле они не являются чем-то особенным и используются постоянно.

3 голосов
/ 01 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...