2016-05-27 2 views
3

Когда я читаю документы или примеры, я часто вижу, как возникает идея, что вы можете назначить анонимную функцию переменной. Почему бы мне на самом деле это сделать, а не просто определить новую функцию?Зачем мне назначать анонимную функцию переменной?

Некоторые примеры:

Clojure/лисповские

(def add2 
    (fn [a] (+ 2 a)) 
(add2 4) ;; => 6 

Python

add2 = lambda e: e + 2 
add2(3) # => 5 

Scala

val add2 = (x: Int) => x + 2 
add2(5) /* => 7 */ 

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

Может ли кто-нибудь объяснить, почему я бы назначил анонимную функцию переменной? Это время выполнения/время компиляции? Существуют ли определенные характеристики, которые делают это благоприятным?

+0

Это действительно в основном основанный на мнении стиль. Но использование lambdas, как в ** Python **, не служит никакой другой «цели», кроме более сложной отладки. –

+1

Я иногда присваиваю имя лямбда-функции, когда мне нужна функция 'key' (например, для' sort'), и когда я думаю, что определение функции в той же строке, где я использую ее, как аргумент, кажется слишком кратким, но определяющим регулярная функция кажется слишком многословной. – timgeb

+0

Я действительно сделал это сегодня утром. Я тестировал 2 функции более высокого порядка, которые имели разные реализации, но должны иметь одинаковый ввод/вывод. Я связал функцию, переданную в 'let', а затем использовал ее в теле. Я мог бы определить его как конкретную функцию, но этого было достаточно для быстрого теста. – Carcigenicate

ответ

1

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

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

Однако, когда вы пишете код, который фактически использует аргументы функции, это более или менее выполняется именно так. Только назначение происходит более косвенно, чем использование оператора.

1

Согласно Python Docs:

Семантически, они лишь синтаксический сахар для нормального определения функции.

afaik, нет особых эксплуатационных характеристик для lambda, что делает его благоприятным. Если вы думаете об использовании лямбда для сложных задач, подумайте еще раз, используйте функции.

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

Редактировать: Добавлена ​​Stefans»предложение

+1

Вы должны добавить «Всегда использовать инструкцию def вместо оператора присваивания, который привязывает лямбда-выражение непосредственно к идентификатору». From https://www.python.org/dev/peps/pep-0008/. Реальное использование лямбда-функций состоит в том, что вы можете использовать небольшие функции в других вещах, таких как списки или карты/фильтры, например, примеры из http://docs.python-guide.org/en/latest/writing/style/#short -средства-манипулировать списками. – StefanS

+0

@STefanS Хорошо, добавим, что :) – noteness

0

В Clojure, причина в том, чтобы вы могли использовать функцию в более чем одном месте. На самом деле

(defn add2 [x] (+ x 2) 

просто сокращенная для

(def add2 (fn [x] (+ x 2)) 
Смежные вопросы