LINUX.ORG.RU
ФорумTalks

лямбды в новых язычках - PR или реальные полезняшки?

 , ,


7

7

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

Ну что есть lambda в каком-нибудь lisp я представляю и даже понимаю зачем оно и как им пользоваться. В lisp'е. А что имеется ввиду под «лямбдой» например, в C#?

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

Только чтобы это не было аналогом перлового однострочника типа

perl -e 'print sub{ $_[0] + $_[1]; }->(1,2)."\n";'
ибо в этом никаких новшеств и преимуществ нету.

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

★★★★★

Ответ на: комментарий от grim

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

Func<int,int,int> add = (x,y) => x+y;
Func<int, int, int> div = (x, y) => x / y;
Func<Func<int, int, int>, Func<int, int, int>> curOp = x => (y, z) => x(y, z);
var curAdd = curOp(add);
var curDiv = curOp(div);

System.Console.WriteLine("curAdd(10,2) {0}", curAdd(10, 2));
System.Console.WriteLine("curDiv(10,2) {0}", curDiv(10, 2));

Насколько я понял, здесь создаются два функтора от двух аргументов. После этого создается функтор curOpt, принимающий в качестве параметра тип предыдущих функторов и возвращающий лямбду с двумя параметрами, в теле которой к этим аргументам применяется переданная функтору функторы (видимо, это демонстрирует замыкание). Кстати, зачем вводить в язык новую сущность «функтор», если есть функции?

Аналог на лиспе:

(defn add [x y] (+ x y))
(defn div [x y] (/ x y))
(defn cur-opt [f] (fn [x y] (f x y)))

(def cur-add (cur-opt add))
(def cur-div (cur-opt div))

(println "curr-add(10, 2) = " (cur-add 10 2))
(prinlln "curr-div(10, 2) = " (cur-div 10 2))

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

Ritmik
()
Ответ на: комментарий от grim

ФВП в вики отсутствует.
Т.е. скаращение - ваше изобретение

В литературе, связанной с функциональным программированием, сокращение ФВП можно встретить довольно-таки часто. Это сокращение — калька с сокращения HOF (Higher Order Function, функция высшего порядка), которое англоязычная вики знает.

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

Мозгов для использования поиска уже не хватает?

Я вас просил привести ссылку в вики на акроним ФВП.
А вы опять от ответа уходите, приводя ссылку на ЛОР.

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

Что-же не ответили на английском?
Я с удовольствием поддержу дискуссию на на нем. Как никак для программиста он важнее русского.

С другой стороны, возможно потому, что судя по «Tell me moar» их вы знаете так-же как и математику и программирование - очень плохо.

grim ★★☆☆
()
Последнее исправление: grim (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

Ну так и писал бы HOF. Хоть понятнее.

Оно-же обиделось, как будто все знают эти сокращения на руском. Я на нём только на ЛОРе и дома общаюсь.
Поверьте дома «ФВП» никто не произносил.

grim ★★☆☆
()
Последнее исправление: grim (всего исправлений: 2)
Ответ на: комментарий от geekless

Почему вы приводите нерабочий код? Где определения list, create_list и push? Запостите пример целиком.

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

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

если где-то в коде ожидается список - то уже выбрана его реализация, либо библиотечная, либо своя

Мы говорим о простоте и лаконичности реализации конкретной задачи на конкретных языках. Никаких «если бы» да «кабы» этот вопрос не подразумевает. Ваш код задачу не решает.

списки только тут из-за закостенелости мышления автора задачи, гораздо быстрее и правильнее будет завести массив констант и получить моментально нужный результат по смещению + длине «списка», это и есть разница между теорией/придирками и реальным решением задач

А если мне надо будет сформировать список по результатам http-запросов, вы мне тоже предложите использовать массив констант?

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

гораздо быстрее и правильнее будет завести массив констант и получить моментально нужный результат по смещению + длине «списка», это и есть разница между теорией/придирками и реальным решением задач


Ага, а заполнять массив будет святой дух.

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

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

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

Т.е. C# это ОО язык программирования с элементами FP. В отличе от той-же Scheme.

Т.е. в сишарп вводят новым синтаксисом (функторы не являются синтаксически функциями)

Не совсем понял вашу мысль
Почему функторы в C# это не функции?


Тем не менее, я не вижу фильтров.
Возможно это расхождение терминологии, поэтому и прошу уточнить:
- Где в этом коде фильтры?

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

Возможно это расхождение терминологии, поэтому и прошу уточнить:
- Где в этом коде фильтры?

Тут скорее непонимание синтаксиса вашего суперязыка. Что ваш код на сишарпе таки делает?

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

Тут скорее непонимание синтаксиса вашего суперязыка.

Запарили вы все.
Где я писал что это суперязык?

Что ваш код на сишарпе таки делает?

curring
Аналог на лиспе выглядит логично.

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

Понял
фраза " map/ fold/filter/sort/etc" под etc может понимать все что угодно, соответственно всегда права.
Вопрос о фильтрах отменяется.

grim ★★☆☆
()
Последнее исправление: grim (всего исправлений: 1)
Ответ на: комментарий от geekless

Мы говорим о простоте и лаконичности реализации конкретной задачи на конкретных языках

в вакууме очевидно, где того же glib не существует

А если мне надо будет сформировать список по результатам http-запросов

то, по твоей логике, я сначала попрошу тебя предоставить код для реализации http-протокола и собс-но запросов

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

Ага, а заполнять массив будет святой дух.

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

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

в вакууме очевидно, где того же glib не существует

Очевидно, что в стандарте языка его не существует.

то, по твоей логике, я сначала попрошу тебя предоставить код для реализации http-протокола и собс-но запросов

Задача была про списки, а не про факториал или http.

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

У вас там довольно бессмысленный код, который демонстрирует обычное замыкание. Какие фильтры вы желаете в нём разглядеть?

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

Очевидно, что в стандарте языка его не существует.

в стандарте любого ЯП много чего не существует, для этого и есть библиотеки

Задача была про списки, а не про факториал или http.

значит задача была слишком оторвана от реальности, т.к. списки там не нужны, впрочем как и все задачи в треде, ну и вот тебе реальная задача - прочитай содержимое www.linux.org.ru/, на Java/C# она решается элементарно, напишешь код на ANSI Common LISP для ее решения? нет? а че так?

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

Нет, пример на C# должен был быть аналогом лисповского

    (define (myfunc f) (lambda (x y) (f x y)))
    ((myfunc +) 4 5)
    ((myfunc /) 6 7)

Так что то, что привнесено в C# и обозвано «лямбдой» это даже не боянъ. :)

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

ну и вот тебе реальная задача - прочитай содержимое www.linux.org.ru/, на Java/C# она решается элементарно, напишешь код на ANSI Common LISP для ее решения? нет? а че так?

А я и не рвался доказывать, что-нибудь про ANSI Common LISP применительно к http. Это во-первых. Во-вторых, сравнение некорректное — средства работы со внешней средой никакого отношения к дизайну языка не имеют. А вот средства работы со структурами данных — имеют самое прямое.

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

Не вижу функции.

правильно. Это НЕ функциональный ЯП. Тут есть СВОИ методы.

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

Посчитал, считает правильно. ЧЯДНТ?

в лиспе данные имеют бесконечный размер и точность? Извини, не знал. В сишечке тип int имеет размер 32 или 64 бита.

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

А я и не рвался доказывать, что-нибудь про ANSI Common LISP применительно к http.

а я не рвался доказывать, что в С есть встроенные списки, это ты мне начал доказывать, что библиотеки нельзя использовать, хотя сам же потом привел в пример http, хотя в Common Lisp в стандарте вообще нет работы с сетью и в нем принципиально нельзя решить такую задачу (про десятки реализаций Common Lisp со своими особенностями умолчим)

Во-вторых, сравнение некорректное — средства работы со внешней средой никакого отношения к дизайну языка не имеют

речь шла не об «средствах работы со внешней средой», хотя это еще одна веселая тема в ФП, речь шла о банальных библиотеках, в том же CL прекрасно есть библиотеки для работы с деревьями, например

А вот средства работы со структурами данных — имеют самое прямое

списки - это частность, структур данных полно, то что где-то все построено на списках не означает, что именно списки должны быть в любом ЯП

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

То есть я могу в php использовать идентификаторы, неизвестные транслятору?

я же использовал.

Я вижу, ты всё еще под кокосом. Эпичный слив.

разупорись и осиль прочитать код.

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

А давай ты НЕ БУДЕШЬ переходить на пхп, а всё таки ответишь на вопрос, который сам и задал:

если ты не понял, C был взят в качестве самого распространённого из древних императивных языков. А не от балды. Ты забыл о чём мы спорим-то? Упустил нить дискуса? Дык глазки подними, сабж почитай.

И не цепляйся - код выше представлен.

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

я же использовал.

В коде на Си использованы понятия list и push, неизвестные транслятору. Теперь накукарекай аналогичное на пхп.

разупорись и осиль прочитать код.

Переменная в похапе создаётся в момент присваивания, если она не существует. Разупорись и осиль познакомиться с языком, вместо того, чтобы чушь нести.

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

если ты не понял, C был взят в качестве самого распространённого из древних императивных языков

Если ты не понял, привести рабочий код вычисления факториала ты так и не осилил. Но покукарекать о лаконичности си это конечно тебе не помешало, диванному теоретику. А тот код, который в треде таки был (хинт: его запостил я), был НЕ КОРОЧЕ кода на лиспе.

И не цепляйся - код выше представлен.

Ага. Мной.

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

Замыкания — костыль? А свободные переменные в лямбда-исчислении — это тоже костыль?

ключевое слово выделено.

То-то сейчас замыкания есть во всех современных ЯП высокого уровня

если все станут биться головой об стену, ты тоже будешь? Ты уже поставил виндовс?

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

«глобальное состояние» может и должно быть локализовано. Инструментарий для этого есть.

В Common Lisp'е?

смотри выше, какая кривизна получается, если писать в императивном стиле на CL.

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

или как поэзия со скобками

Гуманитарии ITT.

не. обычный фанатег.

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

А погроммирование высокоуровневых задач - гуманитарная дисциплина, если чо.

я всегда говорил, что погроммисты(в отличие от программистов) - ГСМ.

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

Кстати, зачем вводить в язык новую сущность «функтор», если есть функции?

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

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

Что-же не ответили на английском? Я с удовольствием поддержу дискуссию на на нем. Как никак для программиста он важнее русского.

4.2

Если русский родной, то именно на нём ты ДУМАЕШЬ. Потому знать его важнее всего.

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

А если мне надо будет сформировать список по результатам http-запросов, вы мне тоже предложите использовать массив констант?

а вы мне предложите написать свой парсер на CL?

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

Ага, погроммист вручную. От 0 до 100. Зря что ли зарплату получает?

конечно. Но если ты настолько тупой, что не умеешь, вот: http://pastebin.com/p847WQpZ

На будущее, в любой нормальной OS достаточно выполнить

$ echo '              define f (x) {
                if (x <= 1) return (1);
                return (f(x-1) * x);
              }
  for(j=1;j<=100;j++){j; f(j);}' | bc
и получить все твои 100 факториалов.

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

конечно. Но если ты настолько тупой

нет, просто им не интересно просто решить задачу, им интересно решать задачу «правильно», как принято в их любимых ЯП, любое другое решение, пусть оно и намного быстрее и лучше подходит для используемых ЯП, они воспринимают в штыки, придираясь и «не замечая» очевидных и простых путей решения, как-то заполнение массива парой строчек

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

Что ты, что ты, это не Ъ. Только ручной труд! Только сишечка! Только хардкор!

ты упоролся?

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

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

Собственно, чтобы понять всю фейковость и надуманость всяких «классов», «наследований», «монад», «функторов», «объектов» и прочих сферических коней в вакууме, достаточно осознавать, что реальный процессор умеет работать только с двумя сущностями - кодом и данными. И любые сферические кони всегда превращаются только в код или данные. И для понятного описания любого сферического коня вполне достаточно простых и понятных терминов.

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

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

Задача была про списки

хватит врать! Задачу Я ставил. И там не было никаких списков. Там были факториалы. А мне сказали, что это только один, а вот 4 факториала мне почему-то не вычислить. А когда вычислил, сказали что не сохранить, а когда сохранил, сказали, что не в список, а когда в список, сказали что списков нет в С, а когда сделал тоже самое на php, сказали что нет функций.

Может хватит демагогии, и признаем честно: основной недостаток моего кода в том, что он не на CL и даже не на схеме?

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

В коде на Си использованы понятия list и push, неизвестные транслятору. Теперь накукарекай аналогичное на пхп.

разуй глазки, и осиль, что значит

$a[] = x;

Переменная в похапе создаётся в момент присваивания, если она не существует.

спасибо, КЭП. Но я это знал и без тебя. В этом примере как раз СПИСОК создаётся, и заполняется нужными факториалами. И зачем мне для этого нужны функции, лямбды, и прочая НЁХ?

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

Совершенно верно. Программирование ради программирования, а не ради решения задачи с помощью программирования.

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

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

Если ты не понял, привести рабочий код вычисления факториала ты так и не осилил.

не ври. Для тебя повторю:

	for(y = 1; x; x--)
		y *= x;
это РАБОЧИЙ КОД ВЫЧИСЛЕНИЯ ФАКТОРИАЛА. Да, тут нет функций, нет замыканий, нет белой кобылы, нет даже зелёной семиножки. Много чего тут нет. Если тебе для вычисления факториала нужна кобыла - не кури больше этой травы. Во всяком случае во время написания своего быдлокода.

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

Все эти linq-и всего лишь простые и очевидные вещи, которые изобретаются в других языках на ходу во время создания прикладных программ прикладными программистами

Еще раз: то, что ты «изобрел» - это не LINQ.

Если это для тебя обидно

Мне нисколько не обидно, что ты умеешь писать простые макросы.

Можешь дальше молиться на linq.

Хотя я за всю жизнь не написал ни строчки на C#, твое разрешение очень важно для меня.

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

В этом примере как раз СПИСОК создаётся

Тебе сейчас «объяснят», что это не СПИСОК, а всего лишь похапешный массив, например :)

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

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

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

почему сразу «грантов»? для доказательства работоспособности алгоритмов очень удобно использовать ФП - они более простые для анализа. Т.е. если у нас есть функция на ФП int mul(int x, int y);, которая выдаёт произведение x*y, то в рамках ФП очень просто доказать её работоспособность. (по сравнению с императивным ЯП). Проблема только в том, что вопрос расхода времени/памяти остаётся за рамками такого исследования. На примере того же факториала очевидно, что операции цикла и рекурсии эквивалентны в математическом смысле, вот только одно но - IRL для рекурсии нужно O(N) памяти, а для цикла O(1). Мало того, константа прорциональности для рекурсии больше (на существующих CPU).

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

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

угу. в пхп это как раз часть языка, с кучей ненужного в данном случае отстоя. Например это ещё и ассоциативный массив. Но по выражению $a[]=x этого не заметно. А в сишечке - будет заметно, что список - это список. И ТОЛЬКО список. Конечно, это сильный баг языка, ибо ведёт к «простыне».

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

разуй глазки

Сам разуй. Тебя ткнули носом, что код использует не определенные символы. После чего ты съехал с темы и начал что-то беспомощно лепетать про пхп. С чего бы это вдруг? Неужели так сложно привести полный исходник на си? Может ты чего-то опасаешься? О чем-то подозреваешь, да?

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

это РАБОЧИЙ КОД ВЫЧИСЛЕНИЯ ФАКТОРИАЛА

Ололо. Так ты и с си не знаком? Ну скомпилируй этот рабочий код.

echo 'for(y = 1; x; x--) y *= x;' > tmp.c && gcc -c tmp.c
Неужели не компилируется? Видимо, что-то случилось, да?

Потом, как осилишь компиляцию, поговорим о том, вычисляет ли этот код факториал, или что-то другое. А то как-то говорить, что не компилирующийся код что-то «вычисляет» — это лол.

Слушай, а ты кем работаешь? Если программистом, то твои работодатели в курсе, что ты ни ухом, ни рылом в предмете?

geekless ★★
()
Последнее исправление: geekless (всего исправлений: 3)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.