Как частичное приложение представлено во время выполнения? - PullRequest
8 голосов
/ 03 апреля 2011

Когда я пишу что-то вроде map (1+) list в Haskell, каково внутреннее представление (1+)? Поскольку это частичное применение (+), аргумент 1 должен быть где-то сохранен, но я не могу разобраться с этим. Может кто-нибудь дать мне краткое объяснение, как реализовано карринг и частичное применение?

Ответы [ 3 ]

10 голосов
/ 03 апреля 2011

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

См. Этот предыдущий вопрос по данным в штучной упаковке и руководству GHC по , как обозначаются символы .

7 голосов
/ 03 апреля 2011

Думайте об этом так: все представлено фрагментом кода («thunk»), который должен вызываться напрямую, чтобы получить результат.Когда вы пишете литерал 1, он компилируется в кусок кода, который при вызове возвращает 1 (на самом деле, fromIntegral 1), и этот фрагмент кода затем используется вместо литерала 1. Это также является ключом клень: вместо того, чтобы что-то вычислять немедленно, создается thunk, который при вызове будет делать вычисления.Если вы передадите это выражение в другую функцию, это будет обработчик, который будет передан, и поэтому вычисление не будет выполняться до тех пор, пока / или что-то не понадобится явно проверить его результат.

В Haskell приложения функций представлены одинаковоway: thunk, который обрабатывает один параметр и возвращает thunk, который либо обрабатывает следующий параметр, либо выдает результат.Таким образом, (1+) является приложением функции (+) 1: (+) - это thunk, который ожидает, что ему будет передано одно число, и возвращает thunk, который ожидает, что ему будет передано еще одно число.Поскольку (+) является строгим, этот второй блок фактически добавляет, а не возвращает блок, который должен быть вызван для фактического добавления.Таким образом, (1+) оценивает этот второй поток, который должен быть вызван с другим номером, который будет предоставлен map, поскольку он повторяется по list.

3 голосов
/ 04 апреля 2011

Вы также можете проверить Реализация функциональных языков: учебное пособие , книга Саймона Пейтона Джонса и Дэвида Лестера.

...