функция карри против обычного метода обратного вызова - PullRequest
0 голосов
/ 17 марта 2012

Я пытаюсь понять, как метод программирования, известный как curry , отличается от обычного интерфейса обратного вызова (такого как интерфейсы Observer / Observable в Java или классический шаблон проектирования Visitor).

Я понимаю, что такое карринг, я просто не понимаю, почему он уникально полезен, поскольку требует собственной терминологии и языковой поддержки.

Может кто-нибудь объяснить ситуацию программирования лучшерешается карри, чем методом обратного вызова?Каково практическое значение того факта, что карри использует отдельную функцию для каждого аргумента?

[update:], чтобы суммировать полученные ответы: карри является неотъемлемой частью того факта, что функции являются гражданами «первого класса»объекты, которые могут быть созданы и переданы как любая другая ссылка на объект.Это позволяет вернуть функцию из функции, другими словами, каррирование.

Что касается причины, по которой карри полезно, то карри предоставляет синтаксис, позволяющий лаконично декорировать вызовы функций, чтобы можно было создавать производные функции с минимальными издержками кода.Принимая во внимание, что в Java вы можете создать несколько перегруженных или «обёрточных» методов для каждого частичного набора параметров, которые в конечном итоге вызывают мастер-метод, содержащий все параметры, каррирование обеспечивает более легкий синтаксис, который позволяет вам генерировать эти «обертки функций» так, как это необходимо в вашем коде.

Ответы [ 2 ]

1 голос
/ 19 марта 2012

Карринг и обратные вызовы - это две совершенно разные технологии.

Обратные вызовы, по сути, являются синонимом «передачи функции в функцию» (т. Е. Функции более высокого порядка, которая потребляет функцию);curry является формой частичного применения, то есть функция, которая не передала все ожидаемые параметры, возвращает новую функцию, которая ожидает только свободные параметры.

Соответственно, они вообще не являются альтернативами.

Curry полезен, потому что он значительно упрощает создание функций, которые могут использоваться, например, в качестве обратных вызовов или в программе без точек.Это также означает, что вы можете, например, передать обратный вызов такой функции, как map, и иметь новую функцию, которая применяет ваш обратный вызов к каждому элементу любого списка, который вы хотите передать ему.

1 голос
/ 17 марта 2012

Ну, это точка языковой поддержки.В Java, например, вы можете определить все виды интерфейсов обратного вызова: один для методов без параметров, один для методов с одним аргументом, один для методов с двумя аргументами и т. Д.

Но функции wehn - это первый классГражданин, это не нужно: функции с одним аргументом сделают свою работу, потому что функции могут быть возвращены.Следовательно, одним важным интерфейсом во всех «функциональных Java-проектах» будет некоторый интерфейс вида:

interface Fun<A,B> {
    public B apply(A a);
}

или тому подобное, который охватывает этот шаблон.

...