Вход | Регистрация
    1  2  3

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

Лямбда функции
Я
   Почему 1С
 
12.02.21 - 14:20
Может вопрос не по профилю форума, но видел подобные вопросы по compscience.
В общем вопрос такой, кто посоветует материал (курсы , книги), чтобы освоить лямбда функции, сами то они просты, но видимо требуют особого понимания как научится мыслить ими.
Я могу читать и понимать код состоящий из каскада лямбда функций, но вот сам так писать не могу (всегда скатываюсь классический код без функциональщины), а хочу практики чтобы набить руку и при этом делать это правильно.
Если кто имеет опыт буду благодарен если поделитесь.
   Почему 1С
 
201 - 16.02.21 - 16:00
Ну тебе нужна функция как параметр а ты передал ничего (передал результат println)
   Uberschall
 
202 - 16.02.21 - 16:06
(201) это не так работает. ()->Unit   <=> ()->{что-то возвращающее Unit или ничего (Unit - аналог void)} <=> ()-> {println()} <=> {println()}
   Почему 1С
 
203 - 16.02.21 - 16:13
Где в (198) определение лямбда выражения?
   Uberschall
 
204 - 16.02.21 - 16:17
(203) точно, тупанул. для java придется лямбду развернуто написать:
lock(syncRoot, ()->System.out.println("внутри блокировки"))
   Почему 1С
 
205 - 16.02.21 - 16:21
Вот, а если речь про dsl то в java это будет выглядеть вырвиглазно а в котлин структурно и красиво, на примере того же html что приводили выше
   fisher
 
206 - 16.02.21 - 16:21
(0) Я в функциональщине ни в зуб ногой, хотя щупал и замыкания и лямбды.
Но слышал, что для погружения в этот мир берут хорошую книжку по хаскелю.
   Uberschall
 
207 - 16.02.21 - 16:25
(205) но понимать-то все-равно надо что там происходит.
   Garykom
 
208 - 16.02.21 - 16:33
(206) Для погружения достаточно знать что любую лямбду можно заменить на обычную Функцию или Процедуру (с передачей параметров по значению)
Но будет "больше кода" и не так "синтаксически сахарно красиво"
   Garykom
 
209 - 16.02.21 - 16:34
(208) тьфу *с передачей параметров по ссылке
   Serginio1
 
210 - 16.02.21 - 17:17
(208) не всегда. Переменные метода по ссылке не передашь, так как время жизни лямбды может быть больше чем время жизни метода
   Ненавижу 1С
 
211 - 16.02.21 - 17:23
(208) вообще нет
1. при замыкании мы конструируем функцию, но вовсе ее не вызываем, возможно вызовем вообще в другом методе, как бы с параметром такое не выйдет
2. нарушилась бы сигнатура функций
   Почему 1С
 
212 - 16.02.21 - 17:28
(206) Что за книжка, автор или название?
   Ненавижу 1С
 
213 - 16.02.21 - 17:34
По крайней мере LINQ мог бы избавить от вот такого:

ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%УсловиеОрганизация%", УсловиеОрганизация);
   Garykom
 
214 - 16.02.21 - 17:36
(210) (211) Дык вы читать то умеете?

ВСЕГДА лямбду можно заменить на вызов процедуры/функции, просто будет не так красиво.
Придется например в временем жизни и сохранением параметров что то допом в коде изобретать да.
   Garykom
 
215 - 16.02.21 - 17:38
(214)+ Это как "можно ли программировать не используя GOTO"
Можно! Но иногда с "безусловным переходом по метке" проще. Аналогично с лямбдой.
   Garykom
 
216 - 16.02.21 - 17:40
Имхо для простоты поддержки λ=goto
лучше не использовать или новичкам особенно тяжко будет
   Ненавижу 1С
 
217 - 16.02.21 - 17:41
(214) и получается скрытый объект с методом в виде самой лямбды и полями в виде переменных замыкания
что собственно и проделывает, например, C#

(215) конечно можно, не используя ЯВНО GOTO, но осознавая что за всеми ветвлениями и циклами лежит JMP
   Garykom
 
218 - 16.02.21 - 17:42
Кстати LINQ лишняя ненужная хрень, лучше нативный SQL разрабу подучить с особенностями реализаций конкретных серверов SQL
Или перейти на концепцию NoSQL с MapReduce понимая что это и зачем.

А не извращаться с трансляторами.
   Ненавижу 1С
 
219 - 16.02.21 - 17:43
(218) каждому своё
   Serginio1
 
220 - 16.02.21 - 17:50
(218) Смысл линка, что легким движением руки мы можем сменить СУБД.
При этом возможности Linq to EF значительно больше чем 1С, а Linq2DB еще больше.
https://github.com/linq2db/linq2db
https://linq2db.github.io/articles/sql/Window-Functions-(Analytic-Functions).html

>> Кстати LINQ лишняя ненужная хрень, лучше нативный SQL разрабу подучить с особенностями реализаций конкретных серверов SQL
Ты это расскажи миллионам C# программистам которые эту хрень используют.
Пока еще реляционные базы никто не вытеснит.
   Garykom
 
221 - 16.02.21 - 17:59
(220) Смысл SQL в том что легким движением мы можем сменить СУБД
   Garykom
 
222 - 16.02.21 - 18:01
(221)+ Достаточно перед каждым вызовом добавить обработку текста sql чтобы особенности конкретной субд учесть
ну там limit или top и прочее типа передачи параметров
короче это пишется за полдня для каждой новой субд
   Garykom
 
223 - 16.02.21 - 18:04
(222)+ имхается уже есть готовые написанные модули для трансляции текстов sql запросов между разными популярными субд
   Доктор Манхэттен
 
224 - 16.02.21 - 18:22
(174) Какой же это link? Первый вариант - это обычная запись, без всякого линка. То что Линк имеет такой же синтаксис - это его проблемы. А я всегда так писал.
   Serginio1
 
225 - 16.02.21 - 19:31
(221) Угу ты 1С перепиши. Есть еще куча инструкций пригодных только для каждой СУБД.
Посмотри на количество инструкций в 1С. Здесь ты не прав.
(224) Это обыкновенный Linq. То, что есть два типа линк это не проблемы а достоинства.
Посмотри на SelectMany плюс let и into

Кстати на чем писал? И можно склеивать запросы?
var query= list.Where(a=>а.поле>5);

var query2=query.Where(a=>а.поле2>5);
   Serginio1
 
226 - 16.02.21 - 19:53
(224) в (174) Первый это Sql подобный, а вот второй через методы расширения SelectMany и первый значительно лаконичнее
var selectedUsers = from user in users
                    from lang in user.Languages
                    where user.Age < 28
                    where lang == "английский"
                    select user;
И на чем ты писал?
   Garykom
 
227 - 16.02.21 - 20:04
(225) >Угу ты 1С перепиши. Есть еще куча инструкций пригодных только для каждой СУБД.
>Посмотри на количество инструкций в 1С. Здесь ты не прав.

1С переписывать нет смысла а вот использовать лишнюю прокладку нафига?
Один хрен оно в sql транслируется и каким местом эта "куча инструкций"?
На другом ЯП в отличие от нативного SQL хрен используешь и переписывай все заново.
   Доктор Манхэттен
 
228 - 16.02.21 - 20:12
(225) Зачем тогда было писать, мол: "В линке лучше", если там то же самое что и в обычном программировании?
   Доктор Манхэттен
 
229 - 16.02.21 - 20:15
(225) На JS можно так склеивать, но склейка происходит по функции "И", а не "ИЛИ".
   Serginio1
 
230 - 16.02.21 - 20:19
(227) >> а вот использовать лишнюю прокладку нафига?
Для интеллисенса, склеивания запросов.
Например один и тотже подзапрос встречается в несколько раз. В 1С используют временные таблицы или склейку текста, что неудобно.
Кстати на stackoverflow используют Dapper https://github.com/StackExchange/Dapper для предстаавления результата запроса в типизированную коллекцию.
На Linq2DB достаточно богатый язык. А Какие то фичи конкретного SQL языка всегда можно вынести в хранимые процедуры. При замене СУБД только переписать их.

Не прав потому, что Linq используют и очень этим довольны. И те у кто программирует на языках в которых нет Linq согласны, что Линк крутая фича.
(225) Еще раз ты можешь сделать SQL запрос?
У тебя ленивые вычисления?

Это два одинаковых Linq запроса users может быть не только коллекцией, но и таблицей бд
var selectedUsers = from user in users
                    from lang in user.Languages
                    where user.Age < 28
                    where lang == "английский"
                    select user;
Для создания аналогичного запроса с помощью методов расширения применяется метод SelectMany:

var selectedUsers = users.SelectMany(u => u.Languages,
                            (u, l) => new { User = u, Lang = l })
                          .Where(u => u.Lang == "английский" && u.User.Age < 28)
                          .Select(u=>u.User);

И тот и другой запрос может работать как с коллекцией так и с БД.
SQl синтаксис более лаконичный и читаемый
 
 
   Serginio1
 
231 - 16.02.21 - 20:25
(230) Что бы понятнее, что для SQL применяются деревья выражений а не лямбда функции пример расширения  between
https://stackoverflow.com/questions/1447635/linq-between-operator
   Serginio1
 
232 - 16.02.21 - 20:31
Кстати про линк на JS
https://habr.com/ru/post/261903/
   Доктор Манхэттен
 
233 - 16.02.21 - 20:32
(230) Из этого я понял что в Linq есть конструкция, которую можно применять как для работы с обычными структурами данных, так и с базами данных, в то время как без Linq приходилось использовать аналогичный синтаксис, но имеющий различия для структур и для БД. Верно?
   Serginio1
 
234 - 16.02.21 - 20:46
(233) Так скажем до линка все пользовались Ado.Net. Строковые запросы. Ну еще делали типизированные датасеты.
С появлением в 2005 yield стало понятно, что можно  с ними можно многое сделать. Так в 2008 появился Linq как для коллекций IEnumerable, так и для Iqueryable.
Народ с настороженностью к ним отнесся. Новый функциональный подход долго принимали. Кто то принял, а кто то и нет. Но большинство приняли особенно для Sql
В студии для отладки можно было пользоваться локально БД.

Там не то что конструкция. Linq запрос склеивается. И выполняется пока явно не вызовут итератор (foreach,Count итд)
Поэтому можно склеивать запросы, передавать их в функции. Для SQL это деревья выражений которые обрабатывает провайдер и строит SQL запрос
Вот здесь наглядно видно во что преобразуется запрос к таблицам 1С
http://catalog.mista.ru/1c/articles/402433/

Просто компилятор по разному обрабатывает Linq запрос для IEnumerable и IQueryable, хотя на вид они оинаковые

Да для скорости и типизации когда мало запросов например на stackoverflow используют Dapper https://github.com/StackExchange/Dapper для предстаавления результата запроса в типизированную коллекцию.
   Доктор Манхэттен
 
235 - 16.02.21 - 22:45
(234) Я не использую Ado.Net, так как пишу под Веб на JS. Но там примерно все то же самое.
   fisher
 
236 - 17.02.21 - 10:06
(212) Real World Haskell, что ли...
   fisher
 
237 - 17.02.21 - 10:13
Но не поручусь, что именно про эту слышал. Не помню. Но эта выглядит достойным кандидатом ибо изобилует примерами промышленных реализаций. А что еще нужно программисту, как не примеры? :)
   fisher
 
238 - 17.02.21 - 10:14
Онлайн доступна бесплатно: http://book.realworldhaskell.org/read/
   fisher
 
239 - 17.02.21 - 10:16
Опа! Оно еще и со свободными комментариями на каждый сниппет и раздел! Очень прикольный формат, как-то не сталкивался с таким.
   Почему 1С
 
240 - 17.02.21 - 11:39
(239) Спасибо большое! Начал читать, как раз речь про то то что я спрашивал.
Я подозревал что нужно читать что то про функциональное программирование и даже скачал пару книг но они не пошли, а твой вариант очень хорош. Прочитаю поделюсь результатом.
   Доктор Манхэттен
 
241 - 17.02.21 - 18:02
Так вот ради рекламы какого сайта была затеяна вся эта беседа!
   fisher
 
242 - 17.02.21 - 18:23
(241) Но красивая же подводочка, согласись!
   Почему 1С
 
243 - 18.02.21 - 10:46
Почитал книжку не много, начало очень интригующее мол от вас только навыки программирования, ну читаю все понятно , понятно, потом хоп и оказывается что все что было понятно, на само деле не понятно. Перечитываю второй раз, походу функциональное программирование не мое.
   Garykom
 
244 - 18.02.21 - 10:59
(243) Попробуй сначала https://ru.wikipedia.org/wiki/Регулярные_выражения изучить
   Почему 1С
 
245 - 18.02.21 - 11:36
(244) Регулярными выражениями владею, периодически пользуюсь, и из последнего например было "\s+[a-zA-Z0-9а-яА-Я_]+\.[a-zA-Z0-9а-яА-Я_]+\s+В\s*\([^\)]*ВТ_ОтборыПоПрограммам[^\)]*\)" - найти все условия в тексте запроса вида '*.* в (Выбрать ВТ.Программа Из ВТ_ОтборыПоПрограммам как ВТ)'. Конечно писать их на лету не могу, но с отладчиком еще не возникало задач которые бы не смог решить.
   Serginio1
 
246 - 18.02.21 - 15:30
(243) Это хаскель. Посмотри F# https://docs.microsoft.com/ru-ru/dotnet/fsharp/
  1  2  3

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.