LINUX.ORG.RU
ФорумTalks

Лямбда-выражения для идиота


2

5

В последнее время только и слышу о новых ЯП с поддержкой лямбда-выражений, это что - мода такая или оно действительно резко стало нужно?

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

Сейчас во всех языках лямбды поддерживаются, ну кроме Си ассемблера и фортрана :) Грубо говоря это анонимная функция.

Reset ★★★★★
()
Ответ на: комментарий от post-factum

ну, например у тебя есть функция

void doall(void (*callback)(void))
{
...
}

Вместо того чтобы делать так

void my_callback()
{
// callback code
}
...
doall(my_callback);
Ты делаешь так
doall(lambda () { /*callback code */} );

Reset ★★★★★
()
Ответ на: комментарий от pat_minus

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

baaba ★★★
()

> это что - мода такая

Да, это мода такая. По сути, оно и жизнь не очень-то и упрощает.

segfault ★★★★★
()
Ответ на: комментарий от Eddy_Em

Да, эти крокодильчики меня тоже удручают.

Лучший образ, который я для себя выработал (цитирую c dxdy):

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

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

mclaudt
()

> только и слышу о новых ЯП с поддержкой лямбда-выражений

Древний-как-говно-мамонта perl, который уже сто лет всё закапывают и никак не закопают — и то так умеет. Зачем писать новые языки специально для поддержки этого функционала, кроме курсовых проектов — непонятно.

name_no ★★
()
Ответ на: комментарий от name_no

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

Reset ★★★★★
()
Ответ на: комментарий от name_no

Ну потому что лямбда-исчисление предоставляет другой подход к вопросу об формализации понятие исчислимость, альтернатива машине Тюринга. В отличии от МТ у лямбда-исчисления отсутствует состояние, что позволяет создать «чистый» язык, без сайд-эффектов. Пока единсвенный чистый general-purpose ЯП - это хаскелл. В остальных - лямбда - это синаксический сахар, не больше.

provaton ★★★★★
()
Ответ на: комментарий от post-factum

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

provaton ★★★★★
()
Ответ на: комментарий от Reset

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

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

name_no ★★
()

У Саттера есть глава где он на примерах расписывает почему для работы с коллекциями нужно по возможности использовать блочные функции типа std::for_each вместо for-циклов. Там же показано что с лямбдой эти конструкции записываются короче.

Absurd ★★★
()

<random-ruby-msg>Блоки рулят.</random-ruby-msg>

___
* Текст в данном сообщении не читабелен всем утверждающим, что XML не читабелен. Ничего не поделаешь, это by design.

Deleted
()
Ответ на: комментарий от provaton

> тов. Ресет не утверждал в том посте что второй вариант лучше или хуже.

Зато ТС спрашивал, нафига оно надо. И раз народ массово клепает для этого языки, значит, считает, что второй вариант лучше. Вопрос от топик-стартера: чем оно лучше и зачем оно надо? Не похоже, чтобы это была истерия по созданию множества ЯП с поддержкой именно определённого сорта синтаксического сахара.

name_no ★★
()
Ответ на: комментарий от provaton

> Ну потому что лямбда-исчисление предоставляет другой подход к вопросу об формализации понятие исчислимость, альтернатива машине Тюринга. В отличии от МТ у лямбда-исчисления отсутствует состояние, что позволяет создать «чистый» язык, без сайд-эффектов. Пока единсвенный чистый general-purpose ЯП - это хаскелл. В остальных - лямбда - это синаксический сахар, не больше.

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

name_no ★★
()
Ответ на: комментарий от name_no

Удобнее бывает, если нужно map или filter пройти по массиву например.

Tark ★★
()
Ответ на: комментарий от post-factum

Для большого кода это будет не так.

Reset ★★★★★
()
Ответ на: комментарий от dt1

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

если нужно захватить в неё переменные, второй вариант превращается в нечитаемое г., которое может распарсить только компилятор

name_no ★★
()
Ответ на: комментарий от name_no

> чем второй вариант лучше первого?

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

list -> filter (_ != 0) -> sort (_ > _) -> map (_ * 2) -> foreach (println)

без лямбды тебе бы пришлось делать как минимум 4 функциклюшки.

Rastafarra ★★★★
()
Ответ на: комментарий от name_no

> если нужно захватить в неё переменные, второй вариант превращается в нечитаемое г., которое может распарсить только компилятор

лол, такое впечатление, что ты лямбды никогда в глаза не видел

dt1 ★★
()
Ответ на: комментарий от name_no

> если нужно захватить в неё переменные, второй вариант превращается в нечитаемое г.

если нужно захватить в нее переменные, то лямбда становится особенно няшной ;)

Rastafarra ★★★★
()

Мне лямбда-выражения почему-то напоминают регекспы. Вроде и крутая штука, можно в 1 строчку написать кучу плюшек...Но человек так не мыслит, сложно читать и понимать принцип работы. Да, без них было бы кода больше, но зато читается спокойно и, что важнее, легче понимается.

kovrik ★★★★★
()

Это же удобно, и порой очень полезно. Мощное средство.

Рекомендую почитать в пфп'3/2009 в статье о введении в элементы ФП главу про лямбды.

yoghurt ★★★★★
()
Ответ на: комментарий от name_no

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

Reset ★★★★★
()
Ответ на: комментарий от name_no

Проще... Зачем определять именованную функцию, если ее нужно применить 1 раз в одном месте. Вот пример на Haskell:

*Main> let function f a b = f a b
*Main> function (\x y -> x + y) 1 3
4
*Main> function (\x y -> x - y) 1 3
-2

Функция определяется непосредственно перед применением.

encyrtid ★★★★★
()
Ответ на: комментарий от name_no

> И раз народ массово клепает для этого языки

Троллить интереснее тебе лень или ума не хватает?

tailgunner ★★★★★
()
Ответ на: комментарий от kovrik

> человек так не мыслит, сложно читать и понимать принцип работы.

бугага.

так и напиши: ниасилил. а потом пойди в мой пример выше и скажи что именно тебе не ясно.

Rastafarra ★★★★
()

Да просто все.
Вот ты заходишь в отдел где всяческие шампуни, гели для душа, мылы...
И тебя накрывает. На полках «Гель для туловища», «Для интимной гигиены», «Для ног», «Для рук»... Ты думаешь: - Окак! Надо чтоб помытьсмя 5 флаконов! Да у меня на крмане столько нету!
А на самом деле, тебе нужен только один флакон, ибо ты нормальный мужик, и тебе просто помыться надо.

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

vada ★★★★★
()
Ответ на: комментарий от kovrik

> Мне лямбда-выражения почему-то напоминают регекспы. Вроде и крутая штука, можно в 1 строчку написать кучу плюшек...

Ну так меру надо знать.

tailgunner ★★★★★
()
Ответ на: комментарий от vada

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

Да-да куда проще разобраться в цикле, который строит какую-нибудь сложную структуру по данным полученным выборкой из N последовательнсотей по нетривиальному критерию, чем в композиции трёх функций.

Begemoth ★★★★★
()
Ответ на: комментарий от kovrik

>Но человек так не мыслит, сложно читать и понимать принцип работы.

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

DNA_Seq ★★☆☆☆
()
Ответ на: комментарий от vada

>А на самом деле, тебе нужен только один флакон, ибо ты нормальный мужик, и тебе просто помыться надо.

Дай угадаю, голову хозяйственным мылом моешь и яйца вытираешь тем же полотенцем что и голову?

DNA_Seq ★★☆☆☆
()
Ответ на: комментарий от Begemoth

Топикстартер, если хочешь, можешь обратить внимание на лисп (Practical Common Lisp http://lisper.ru/pcl/). Открой раздел где описывается функция mapcar. Лямбда является её логическим развитием.

Мне помогла разобраться вот эта лекция:
http://www.cad.dp.ua/kurs/LECTURE6/lecture6.html

Со слов: «Одноразовая» функция создается функцией Лиспа LAMBDA:

Вот тут конкретно по лямбде:
http://autolisp.ru/2009/09/16/lambda-functions/

baaba ★★★
()
Ответ на: комментарий от baaba

Сплюнь. Разбираться с лямбдами по лиспу - не лучшая идея, имхо. Для этого есть отличный курс лекций Джона Харрисона(начало с лямбдами читается за вечер), вот перевод : http://code.google.com/p/funprog-ru/downloads/list

Norgat ★★★★★
()

> это что - мода такая или оно действительно резко стало нужно?

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

const86 ★★★★★
()
Ответ на: комментарий от mclaudt

только вот математикам жутко не нравится

я думаю, им не нравится то, что под эту аналогию можно подвести что угодно

да и вообще - зачем перегружать простой формализм куда более сложными аналогиями? особенно учитывая то, во что они разрастутся при отходе от простого нетипизированного лямбда-исчисления к чему-нибудь сколько-нибудь полезному в реальной жизни (к той же System-F, например)

jtootf ★★★★★
()
Ответ на: комментарий от mclaudt

> Только вот математикам жутко не нравится, когда простую конструктивную суть их построений обраруживают таким образом
Щито??

kermzyxer
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.