Карри: практические последствия

Мое понимание проблемы исходит от Heilperin's et al. "Конкретная абстракция". Я понял, что каррирование - это перевод оценки функции, которая использует несколько аргументов для оценки последовательности функций, каждая с одним аргументом. У меня есть четкие семантические различия между двумя подходами (могу ли я назвать их так?), Но я уверен, что я не понял практических последствий этих двух подходов.

Пожалуйста, обратите внимание, в Ocaml:

# let foo x y = x * y;;
foo : int -> int -> int = <fun>

а также

# let foo2 (x, y) = x * y;;
foo2 : int * int -> int = <fun>

Результаты будут одинаковыми для двух функций. Но, на самом деле, что отличает две функции? Читаемость? Вычислительная эффективность? Мой недостаток опыта не дает этой проблеме адекватного прочтения.

2 ответа

Решение

Прежде всего, я хотел бы подчеркнуть, что из-за оптимизации компилятора две вышеупомянутые функции будут скомпилированы в один и тот же код сборки. Без оптимизации стоимость каррирования была бы слишком высокой, т. Е. Применение функции карри потребовало бы выделения количества замыканий, равного количеству аргументов.

На практике функция curry полезна для определения частичного применения. Например, ср.,

let double = foo 2
let double2 x = foo2 (2,x)

Другим следствием является то, что в каррированном виде вам не нужно выделять временные кортежи для аргументов, как в примере выше, функция double2 создаст ненужный кортеж (2,x) каждый раз это называется.

Наконец, форма с карри фактически упрощает рассуждение о функциях, как сейчас, вместо N семьи N-нари функции, у нас есть только унарные функции. Это позволяет одинаково набирать функции, например, набирать 'a -> 'b применимо к любой функции, например, int -> int, int -> int -> intи т. д. Без каррирования нам потребуется добавить числовые аргументы в тип функции со всеми негативными последствиями.

С первой реализацией вы можете определить, например,

let double = foo 2

вторая реализация не может быть частично использована повторно.

Другие вопросы по тегам