Лямбда функции в php

Обновлено: 05.07.2024

Что такое лямбда в мире компьютерных наук для человека без опыта работы в области компьютерных технологий?

см это для того, как лямбда - функции выглядят на разных языках, и в каком году они были введены в этих языках.

Лямбда происходит от лямбда-исчисления и относится к анонимным функциям в программировании.

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

питон

Как видно из фрагмента Python, функция adder принимает аргумент x и возвращает анонимную функцию или лямбду, которая принимает другой аргумент y. Эта анонимная функция позволяет вам создавать функции из функций. Это простой пример, но он должен передать силу лямбды и замыкания.

Примеры на других языках

Perl 5

JavaScript

JavaScript (ES6)

Схема

стриж

PHP

Haskell

Ява увидеть этот пост

Lua

Котлин

Рубин

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

Ruby - это Ruby, для ламбд есть сокращение, поэтому вы можете определить adder это следующим образом:

р

@Maxpm функтор может быть стандартным объектом с полями и функциями экземпляра, тогда как лямбда-функция обычно состоит только из одной строки инструкций. Это может варьироваться в зависимости от языка, конечно.

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

@KyleDelaney действительно, анонимность не является обязательным условием для лямбды, действительно есть лямбда-функции, которые не являются анонимными, как вы указываете на них даже в примере

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

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

Я бы предложил Console.WriteLine("Calculator: op " + op.Method.Name + " (" + a + ", " + b + ") text-muted font-weight-lighter"> — 23

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

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

Простой пример (используя Scala для следующей строки):

где аргумент foreach метода является выражением для анонимной функции. Вышеприведенная строка более или менее совпадает с написанием чего-то подобного (не совсем реальный код, но вы поймете):

за исключением того, что вам не нужно беспокоиться о:

  1. Объявление функции где-то еще (и необходимость искать ее при повторном рассмотрении кода позже).
  2. Называя что-то, что вы используете только один раз.

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

вместо того, чтобы просто написать выражение, где оно вам нужно:

Точная запись варьируется от языка к языку; Греческий не всегда требуется! ;-)

Это относится к лямбда-исчислению , которое является формальной системой, которая просто имеет лямбда-выражения, которые представляют функцию, которая принимает функцию в качестве единственного аргумента и возвращает функцию. Все функции в лямбда-исчислении относятся к этому типу, т.е. λ : λ → λ .

Лисп использовал лямбда-концепцию для именования литералов своих анонимных функций. Эта лямбда представляет функцию, которая принимает два аргумента, x и y, и возвращает их произведение:

Это может быть применено в строке, как это (оценивается до 50 ):

Лямбда-исчисление является последовательной математической теорией замещения. В школьной математике можно увидеть, например, в x+y=5 паре с x−y=1 . Наряду со способами манипулирования отдельными уравнениями также возможно объединить информацию из этих двух, при условии, что подстановки между уравнениями выполняются логически. Лямбда-исчисление кодифицирует правильный способ сделать эти замены.

Учитывая, что y = x−1 это допустимая перестановка второго уравнения, это: λ y = x−1 означает функцию, заменяющую символы x−1 для символа y . Теперь представьте себе применение λ y к каждому члену в первом уравнении. Если термин - y тогда выполнить замену; иначе ничего не делать. Если вы сделаете это на бумаге, вы увидите, как применять это λ y сделает первое уравнение разрешимым.

Это ответ без какой-либо информатики или программирования.

Вот как квадратная функция может быть определена в императивном языке программирования (C):

Переменная x является формальным параметром, который заменяется фактическим значением, которое должно быть возведено в квадрат при вызове функции. На функциональном языке (Схема) такая же функция будет определена:

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

лямбда

Немного упрощено: лямбда-функция - это функция, которая может быть передана другим функциям, и ее логика доступна.

LinqToSql может прочитать эту функцию (x> 15) и преобразовать ее в фактический SQL для выполнения с использованием деревьев выражений.

Заявление выше становится:

Это отличается от обычных методов или анонимных делегатов (которые на самом деле просто магия компилятора), потому что они не могут быть прочитаны .

Теперь дерево выражений не может быть прочитано - SomeComplexCheck не может быть разбит. Оператор SQL будет выполняться без где и каждая строка в данных будет пропущена SomeComplexCheck .

Лямбда-функции не следует путать с анонимными методами. Например:

Анонимные методы не могут быть прочитаны, и поэтому логика не может быть переведена, как это возможно для лямбда-функций.

Анонимная функция лямбда является частью PHP 5.3. Какое использование имеет? Есть ли что-нибудь, что можно делать только с лямбдой? Является ли лямбда лучше для определенных задач?

Я видел пример Фибоначчи, и мне действительно не нужно писать последовательности Фибоначчи, поэтому я все еще не уверен, насколько он полезен для тех задач, с которыми я сталкиваюсь при написании приложений веб-приложений. Так что же с ним делать в "реальной жизни"?

ОТВЕТЫ

Ответ 1

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

Я бы использовал их для обратных вызовов для таких функций, как:

До 5.3 вам придется.

Ответ 2

Анонимные функции (замыкания) могут быть созданы как локальные функции (таким образом, не перекрывая глобальное пространство, как предложил Датан).

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

(Конечно, этот пример может быть проще без закрытия, но это просто для демонстрации.)

Ответ 3

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

Как и в случае вышеизложенного, лямбды могут использоваться как "недолговечные" функции. Например, алгоритмы сортировки обычно должны знать только, если переменная a меньше переменной b для любой комбинации a и b . Чтобы создать общий алгоритм сортировки, способный обрабатывать любой класс объектов, вы можете сделать свое определение функции сортировки таким, чтобы оно принимало функцию, используемую в качестве компаратора. Предоставление лямбды в качестве функции компаратора означает, что вы можете определить свое поведение сортировки на основе каждого вызова, вместо того, чтобы определять "реальную" функцию, которая будет жить в течение всего срока службы вашего script только для обработки этого одного случая сортировки.

Ответ 4

Несмотря на все виды использования, которые можно использовать для лямбда-функций, в PHP он также допускает нечто особенное, называемое замыканием. Это возможность сделать переменные в текущей области доступными для функции задолго до того, как текущая область перестанет существовать.

Чтобы упомянуть некоторые полезные шаблоны, которые позволяют вам закрыть, можно реализовать Memoization (Caching) и Curry.

Также очень полезны функции отбрасывания или обратного вызова, которые @Matt выделил в своем ответе.

Подробнее о закрытии, проверьте этот вопрос: Как работают блокировки JavaScript?

@niki-timofe, это слабое оправдание. Если вы не приложите усилий, чтобы задать хороший вопрос, то не можете ожидать, что мы приложим усилия, чтобы дать хороший ответ. Таким образом вам придется удовлетвориться копипастой из ссылки выше, что несколько глупо для программиста, ибо подразумевает выполнение машинной работы вручную.

4 ответа 4

Лямбда-функции - это функции, у которой фактически нет имени. Таким образом математики упростили до невозможности формат записи функции, а вообще лямбда-исчислениями пытались формализовать вычисления

λ — означает, что это лямбда-функция. Всё что после неё - список аргументов, в идеале абсолютно любого типа, в том числе может быть и другая лямбда-функция. После точки идёт "тело функции", а уже потом, собственно, идёт аргумент, который будет передан. Т.о.

Здесь в качестве параметра x выступает другая лямбда-функция λy.y + 1 , в которую передаётся параметр 2. То есть любая лямбда функция является функцией высшего порядка, может принимать в качестве аргумента другую функцию и возвращать функцию:

Сложность составляет только явное указание типа аргументов и возвращаемого значения.

лямбда анонимная функция является частью PHP 5.3. Какая от него польза? Есть ли что-нибудь, что можно сделать только с лямбда? Лямбда лучше подходит для определенных задач?

Я видел пример Фибоначчи, и мне действительно не нужно писать последовательности Фибоначчи, поэтому я все еще не уверен, что это полезно для тех задач, с которыми я сталкиваюсь при написании веб-приложений. Так что же с ним делать в"реальной жизни"?

анонимные функции (замыкания) могут быть созданы как локальные функции (таким образом, не заполняя глобальное пространство, как предложил Дафан).

С помощью ключевого слова " use " переменные, которые передаются или создаются функцией enclosing, могут использоваться внутри закрытия. Это очень полезно в функциях обратного вызова, которые ограничены в их списке параметров. Переменные" use " могут быть определены вне закрытия, устраняя необходимость переопределять их каждый раз, когда закрытие называемый.

(конечно, этот пример может быть проще без закрытия, но это только для демонстрации.)

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

как и выше, лямбды могут использоваться в качестве" недолговечных " функций. Например, алгоритмы сортировки обычно должны знать только, если переменная a меньше переменной b для любой комбинации a и b . Чтобы создать универсальный алгоритм сортировки, способный обрабатывать любой класс объектов, можно сделать определение функции сортировки таким, чтобы она принимала функцию для использования в качестве компаратора. Предоставление лямбда в качестве функции компаратора означает, что вы можете определить свое поведение сортировки на основе каждого вызова, а не определять "реальную" функцию, которая будет жить в течение всего срока действия вашего скрипта только для обработки этого одного случая сортировки.

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

просто чтобы упомянуть некоторые полезные шаблоны, которые закрытие позволяет вам, можно реализовать Memoization (Кэширование) и Карри.

также очень полезны выбрасывать или функции обратного вызова, которые @Matt выделил в своем ответе.

для получения дополнительной информации о закрытии, проверьте этот вопрос:как сделать замыкания в JavaScript работает?

Читайте также: