Причем здесь лямбда?

120
27 января 2020, 18:30

Анонимные делегаты в Java 8 не являются лямбда-выражениями, т. к. в последних не может быть переменных изменяющих свои значения. Так каким боком тут слово лямбда? Причем здесь лямбда-исчисление? С таким же успехом определение функции можно было бы назвать (неверно) лямбда выражением.

Если я заблуждаюсь, скажите в чем? Не следует ли перестать употреблять слово сочетания "лямбда функция" потому, что это:
1) не лямбда
2) не функция
?

Upd2: Я убрал свое предложение. До добавлю уточнение. Насколько псевдо-лямбда-выражения соответствуют лямбде в настоящих функциональных языках?

Answer 1

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

Можно считать, что используемые в программировании определения в некотором смысле расширяют математические: математические функции всё ещё можно представлять в виде функций в понимании языков программирования, а непосредственно после оператора присваивания выражения оказываются равны с точки зрения математики.

Точно так же и с лямбдами - понятие, пришедшее из лямбда-исчисления, обобщили, и теперь оно означает сокращённо записанную функцию с замкнутыми внешними переменными, опционально в форме AST. Бессмысленно писать гневные комментарии - теперь в программировании у терминов "лямбда-функция" и "лямбда-выражение" именно такое значение.

Answer 2

т. к. в последних не может быть переменных изменяющих свои значения

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

Вообще, можно у Фаулера почитать статью старенькую на этот счёт, которая актуальность всё ещё не потеряла:

Essentially a lambda is a block of code that can be passed as an argument to a function call

READ ALSO
Не удается в фрагменте получить методы из интерфейса. Как это можно исправить?

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

Почему при попытки получить методы из интерфейса, пишет Cannot resolve method 'isProduct()' и Cannot resolve method 'getMenuTitle()'ourMenuItemsя прописываю как ArrayList

111
настройка JNDI @Resource

настройка JNDI @Resource

в проекте (spring boot + embedded tomcat) я использую jar файл в котором есть класс

140
Не понятная работа уведомления

Не понятная работа уведомления

Создаю уведомление для приложения, вроде нормально работало, и резко не понимаю из-за чего(вроде ничего такого не делал) перестало вообще...

134