2016-10-03 7 views
1

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

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

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

и

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

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

+0

Разве вы не хотите сравнивать 'let foo x y = x * y ;;' и 'let foo = fun x -> fun y -> x * y ;;' ?? –

+0

Вы правы, спасибо, что помогли мне сделать это яснее. – Worice

ответ

2

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

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

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

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

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

1

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

let double = foo 2 

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