|
Лямбда функции | ☑ | ||
---|---|---|---|---|
0
Почему 1С
12.02.21
✎
14:20
|
Может вопрос не по профилю форума, но видел подобные вопросы по compscience.
В общем вопрос такой, кто посоветует материал (курсы , книги), чтобы освоить лямбда функции, сами то они просты, но видимо требуют особого понимания как научится мыслить ими. Я могу читать и понимать код состоящий из каскада лямбда функций, но вот сам так писать не могу (всегда скатываюсь классический код без функциональщины), а хочу практики чтобы набить руку и при этом делать это правильно. Если кто имеет опыт буду благодарен если поделитесь. |
|||
147
ДенисЧ
15.02.21
✎
16:29
|
(146) Память и процессор нынче не ресурс, пора привыкнуть. Для того, чтобы 2+2 посчитать - нужен минимум i9
|
|||
148
Доктор Манхэттен
15.02.21
✎
17:43
|
(139) Лямбды в любом случае нужно отлаживать. А как отладить промежуточные результаты циклов? Никак. Поэтому нужно разбивать на отдельные шаги, а не лепить все в один цикл.
|
|||
149
Serginio1
15.02.21
✎
18:05
|
(148) Ты SQL запросы также отлаживаешь?
Еще раз Linq для коллекций это дополнительный бонус. Основное это SQL запросы. Но если ты привык мыслить циклами, то декларативное программирование не для тебя. |
|||
150
Ненавижу 1С
гуру
15.02.21
✎
18:06
|
Просто в тему https://m.habr.com/ru/company/typeable/blog/542440/
|
|||
151
Доктор Манхэттен
15.02.21
✎
18:08
|
(149) Мы не про SQL запросы говорим. Если не видишь разницы, то функциональное программирование не для тебя.
|
|||
152
Ненавижу 1С
гуру
15.02.21
✎
18:09
|
(151) почему то мне кажется ты тролль
|
|||
153
Вафель
15.02.21
✎
18:10
|
вот именно что отладка скл запросов это боль
|
|||
154
Доктор Манхэттен
15.02.21
✎
18:10
|
(152) Когда кажется, крестятся.
|
|||
155
Serginio1
15.02.21
✎
18:18
|
(151) Самому то не смешно? Мы говорим про Linq. Он имеет SQL подобный синтаксис смотри (133)
вот два одинаковых запроса первый SQL подобный Var numQuery1 = from num in numbers where num % 2 == 0 orderby num select num; Второй обычный //Method syntax: var numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n => n); Если в качестве источника будет выступать не IEnumerable а таблица БД IQueryable то будет запрос к таблице Вот пример http://catalog.mista.ru/1c/articles/402433/ (153) Linq помогает склеивать запросы. И это удобнее чес склеивать текстовые запросы. Отладив поодиночке можно их собирать. |
|||
156
Доктор Манхэттен
15.02.21
✎
20:26
|
(155) А, это хрень для запросов. Тогда извиняюсь, ошибся. Я думал мы говорим про функциональное программирование.
|
|||
157
Serginio1
15.02.21
✎
20:56
|
(156) >> Но если ты привык мыслить циклами, то декларативное программирование не для тебя.
https://ru.wikipedia.org/wiki/Language_Integrated_Query LINQ к объектам Представляет собой не что иное, как функциональное программирование, замаскированное под синтаксис SQL[8]. |
|||
158
Serginio1
15.02.21
✎
21:11
|
157+ https://rsdn.org/article/dotnet/LinqAsStapToFp.xml#EZFAC
Многим может показаться странным то, что ФП в LINQ замаскировано под SQL. Однако это не просто маскировка. Идеи ФП нацелены на то, чтобы сделать программирование более декларативным. Программируя в стиле ФП, мы как бы описываем то, что хотим получить, а не то, как мы это хотим получить. Именно это призван делать и SQL. SQL – это язык запросов, с помощью которого мы лишь описываем, что хотим выбрать из БД (или как хотим ее изменить), но при этом мы не задаем конкретный (императивный) алгоритм обработки данных. |
|||
159
Вафель
15.02.21
✎
21:57
|
а вот интересно. если в линк какую-нибудь функцию подсунуть что скл не поддерживает, то как оно в запрс транслируется?
|
|||
160
Serginio1
15.02.21
✎
22:04
|
(159) Там не функция а деревья выражений, хоть синтаксис и один. https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/concepts/expression-trees/
При обработке дерева выражений провайдером выдаст ошибку |
|||
161
Serginio1
16.02.21
✎
00:01
|
(141)>> От количества циклов тут мало что зависит. Это доли миллисекунды. Тормоза тут не в циклах, а в медленных вызовах через интерфейс и замыкания всякие.
А для промежуточных результатов нужно выделять дополнительные списки и значит дополнительные расходы на память и Add в список. Ну и конечно сравнивать инлайный if (d < 100) count++; не совсем правильно. При сравнении строк уже разница будет минимальна. Не говоря уже о group by, sort by, Select |
|||
162
Доктор Манхэттен
16.02.21
✎
00:19
|
(155) По сути ничего не поменялось. Ну раскрыли скобки, убрали точки. Синтаксис немного поменялся, но в остальном все так же.
|
|||
163
Кирпич
16.02.21
✎
08:12
|
(161) "Ну и конечно сравнивать инлайный if (d < 100) count++; не совсем правильно."
Схрена ли неправильно. Очень даже правильно. Если большие объемы данных и нужна скорость, то linq использовать нельзя (если это не для SQL). Это же ясно как день. А то, что c Linq всё красиво и понятно - это тоже вопрос. Когда по одной строчке в лямбду, то да. А если по 100 строк, то вся красота и понятность исчезает и остаются только тормоза. |
|||
164
Доктор Манхэттен
16.02.21
✎
08:20
|
(163) В лямбду и без Linq можно, см пример (155):
var numQuery2 = numbers .Where(num => num % 2 == 0) .OrderBy(n => n); Это даже короче и понятнее чем link: Var numQuery1 = from num in numbers where num % 2 == 0 orderby num select num; |
|||
165
Кирпич
16.02.21
✎
08:22
|
(161) "А для промежуточных результатов нужно выделять дополнительные списки"
А нафига промежуточные результаты? Я так же могу всё сделать в одном цикле и выделить память только под конечный результат. Можно все сделать так же как в linq, только без лишних вызовов виртуальных методов. |
|||
166
Почему 1С
16.02.21
✎
09:02
|
(165) Нужно просто красиво и с легкой поддержкой кода, быстро тоже нужно но в последнюю очередь. Я хоть и не умею еще писать подобное, но вот в чужом коде гораздо быстрее могу разобраться если он написан в функциональном стиле(условно). От того и интерес к этим лямбда выражениям
|
|||
167
Кирпич
16.02.21
✎
09:23
|
(166) "быстро тоже нужно но в последнюю очередь."
Быстро нужно когда надо, а не в последнюю очередь. Если тебе JSON гонять двум пользователям, то пожалуйста. А если у тебя игровой движок или какая нибудь 3D модель урагана Катрина, то совсем другое дело. |
|||
168
Ненавижу 1С
гуру
16.02.21
✎
09:36
|
(167) Преждевременная оптимизация — корень всех зол. Дональд Кнут.
|
|||
169
Кирпич
16.02.21
✎
09:38
|
(168) Правильно. Пускай 1С открывается по 5 минут. Зато всё по Кнуту :)
|
|||
170
Кирпич
16.02.21
✎
09:41
|
(168) Да и Кнут это написал, когда оптимизацией считалось переписывание куска программы на ассемблере
|
|||
171
Почему 1С
16.02.21
✎
09:43
|
(167) А почему тогда для ураганов катарина, ИИ, дата майнига и других научных вычислений так популярен Питон, который совсем не про скорость выполнения.
(169) Я сейчас имею дело с конфой на 1С, которая по моим понятиям должно просто жестко висеть потому как очень много всего сделано не оптимально и не правильно сточки зрения практик и рекомендаций, но SQl каким то образом вытягивает это поделие до работоспособного состояния. |
|||
172
Кирпич
16.02.21
✎
09:44
|
(171) "других научных вычислений так популярен Питон"
потому что в питоне используются библиотеки написанные на Си |
|||
173
Почему 1С
16.02.21
✎
09:49
|
(172) Ну вот, острые умы найдут как оптимизировать высокоуровневый код которым будут пользоваться люди с умом попроще в LInq лямдах и питонах и всем будет хорошо
|
|||
174
Serginio1
16.02.21
✎
10:38
|
(164) Ты написал два вида Linq. Какой хочешь такой и используй.
Нередко приходится использовать 2 синтасиса. Опять же SelectMany проще и понятнее использовать в Sql синтаксисе 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 подобном синтаксисе есть let очень удобная вещь https://docs.microsoft.com/ru-ru/dotnet/csharp/linq/group-query-results https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/let-clause string[] strings = { "A penny saved is a penny earned.", "The early bird catches the worm.", "The pen is mightier than the sword." }; // Split the sentence into an array of words // and select those whose first letter is a vowel. var earlyBirdQuery = from sentence in strings let words = sentence.Split(' ') from word in words let w = word.ToLower() where w[0] == 'a' || w[0] == 'e' || w[0] == 'i' || w[0] == 'o' || w[0] == 'u' select word; |
|||
175
Serginio1
16.02.21
✎
10:44
|
(165) Нужна скорость используй Linq Rewriter или LinqOptimizer. Только вот таких людей не очень много.
Не нужна экономия пару тактов. Ну и конечно же ты пишешь на С++, ибо на 1С и питоне про инлайнинг не знают. А в 1С и о замыканиях и не знают, не то, что о Linq |
|||
176
Serginio1
16.02.21
✎
10:57
|
174+ tot into
https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/into from row in rows select row.Split(',') into columns let identifier = columns[0].Replace("Prefix_", string.Empty) group columns by identifier into g select new Log { Identifier = g.Key, DurationInSeconds = (from dur in g let duration = DateTime.Parse(dur[1]) select duration.Hour * 3600 + duration.Minute * 60 + duration.Second).Sum() } |
|||
177
Uberschall
16.02.21
✎
12:08
|
между делом спрошу, вдруг кто посоветует книгу для котлина по корутинам?
|
|||
178
Uberschall
16.02.21
✎
12:15
|
(175) по поводу оптимизации я выше писал, что есть разница между inline и не inline функциями (замыкания на не inline тратят время на создание оберток). по поводу циклов: есть возможность (не знаю как в C#) не создавать промежуточные выгрузки, а использовать отложенные операции через секвенции. При желании можно дальше пойти и использовать сплитераторы и многопоточную обработку stream'ов для java (но не все можно раздробить- это вопрос конурентности). Ну и не стоит забывать, что кроме оптимизации есть стоимость поддержки. Для декларативного стиля это большой плюс по сравнению с императивным- но это уже переход в DSL.
|
|||
179
Garykom
гуру
16.02.21
✎
12:25
|
(177) не тупи какие к черту корутины на котлине если основное применение котлина это трансляция в java совместимый байт код
короче книги по java и многопоточности в зубы и вперед |
|||
180
Uberschall
16.02.21
✎
12:27
|
(179) это понятно. но хочется тему раскрыть для себя, чтобы, если зайдет обсуждение, понимать что там происходит.
|
|||
181
Кирпич
16.02.21
✎
12:34
|
(177) Кто будет писать книги про корутины. На хабре статью прочитай и хватит. https://habr.com/ru/company/alfa/blog/336228/
|
|||
182
Uberschall
16.02.21
✎
12:37
|
(181) да, видел статью, но после java concurency (библиотека или книга) как-то не густо...
|
|||
183
Почему 1С
16.02.21
✎
13:04
|
(177) какое то своеобразное у тебя понимание применения котлина Kotlin > Java, это как сказать зачем тебе c++ когда он всего лишь переводит в машинный код.
|
|||
184
Почему 1С
16.02.21
✎
13:06
|
(182) Теория параллельных вычислений это одно, а конкретная реализация их в языке это более узкая тема которая действительно не стоит отдельной книги.
|
|||
185
Serginio1
16.02.21
✎
13:42
|
Мне в котлине понравилось легкое создание DSL. Например аналог lock в kotlin — можно реализовать просто функцией, а не отдельной языковой конструкцией:
lock(syncRoot) { doWork(); } https://kotlinlang.org/docs/reference/type-safe-builders.html |
|||
186
Garykom
гуру
16.02.21
✎
13:49
|
(185) дык Java же
|
|||
187
Почему 1С
16.02.21
✎
13:52
|
(186) хочу видеть как этот код ты скомпилишь на java
|
|||
188
Garykom
гуру
16.02.21
✎
13:56
|
(187) https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
как бы наоборот котлина в яву "компилится" |
|||
189
Почему 1С
16.02.21
✎
14:18
|
я про реализацию DSL не про конкретно lock, то есть synchronized это конструкция языка а lock это функция с лямбда параметром, а внутри скорее всего и сидит synchronized
То что Kotlin ограничен JVM не спорю, просто у него уровень абстракции выше и красивее все реализовывается |
|||
190
Uberschall
16.02.21
✎
15:04
|
(183) а что в этом странного? Kotlin создавался на основе Java, за основу были взяты её библиотеки, требовалась прямая поддержка.
(189) реализация DSL (да и вообще большей части Kotlin) исходит из соглашений, позволяющих составлять синтаксические конструкции. те же инфиксные вызовы типа 1 to "one", можно делать в более традиционном стиле типа 1.to("one") из java и наоборот. "а внутри скорее всего и сидит synchronized" - совсем не факт. synchronized построен на мониторе, а Lock- на парковке потока. |
|||
191
Uberschall
16.02.21
✎
15:06
|
(187) чтобы понять как перевести в более традиционный вид, здесь недостаточно информации. тут вообще lock может быть экземпляром объекта, для которого определен метод invoke (соглашение)...
|
|||
192
Почему 1С
16.02.21
✎
15:19
|
(191) ну тут фишка что последний параметр типа лямбда можно передавать не как параметр а описывать телом этой самой функции. Lock тут я понимаю как функцию
fun lock(par:Any, todo:()->Unit){ synchronized(par) { todo() } } |
|||
193
Serginio1
16.02.21
✎
15:20
|
(190) lock это Monitor в try finally
https://stackoverflow.com/questions/2837070/lock-statement-vs-monitor-enter-method System.Threading.Monitor.Enter(x); try { ... } finally { System.Threading.Monitor.Exit(x); } |
|||
194
Почему 1С
16.02.21
✎
15:20
|
Реализация функции естественно может быть любой, что тоже даст уровень абстракции в будущем
|
|||
195
Serginio1
16.02.21
✎
15:21
|
Вот все что в try{...} и есть лямбда,
|
|||
196
Uberschall
16.02.21
✎
15:38
|
(192) возможно.
(193) в java synchronized может быть либо методом, либо локальным блоком. скорее всего имелось ввиду что-то такое или как в (192) fun lock(syncRoot: Lock, action: ()->Unit){ lock.lock() try{action()} finally{lock.unlock} } вызов: val syncRoot = Lock() lock(syncRoot){prinln("внутри блокировки")} в общем, особо никаких проблем с вызовом из java |
|||
197
Почему 1С
16.02.21
✎
15:41
|
(196) Java так умеет lock(syncRoot){prinln("внутри блокировки")}?
|
|||
198
Uberschall
16.02.21
✎
15:42
|
(197) lock(syncRoot, prinln("внутри блокировки")) - то же самое
|
|||
199
Почему 1С
16.02.21
✎
15:47
|
(198) что возвращает println? ))) но суть не в этом, а в том что в Котлин это реализовано красиво, хотя по функциональности может быть тем же самым
|
|||
200
Uberschall
16.02.21
✎
15:53
|
(199) соответствует сигнатуре параметра ()->Unit. println- стандартный метод, ничего не возвращает (в терминах Kotlin- это Unit).
|
|||
201
Почему 1С
16.02.21
✎
16:00
|
Ну тебе нужна функция как параметр а ты передал ничего (передал результат println)
|
|||
202
Uberschall
16.02.21
✎
16:06
|
(201) это не так работает. ()->Unit <=> ()->{что-то возвращающее Unit или ничего (Unit - аналог void)} <=> ()-> {println()} <=> {println()}
|
|||
203
Почему 1С
16.02.21
✎
16:13
|
Где в (198) определение лямбда выражения?
|
|||
204
Uberschall
16.02.21
✎
16:17
|
(203) точно, тупанул. для java придется лямбду развернуто написать:
lock(syncRoot, ()->System.out.println("внутри блокировки")) |
|||
205
Почему 1С
16.02.21
✎
16:21
|
Вот, а если речь про dsl то в java это будет выглядеть вырвиглазно а в котлин структурно и красиво, на примере того же html что приводили выше
|
|||
206
fisher
16.02.21
✎
16:21
|
(0) Я в функциональщине ни в зуб ногой, хотя щупал и замыкания и лямбды.
Но слышал, что для погружения в этот мир берут хорошую книжку по хаскелю. |
|||
207
Uberschall
16.02.21
✎
16:25
|
(205) но понимать-то все-равно надо что там происходит.
|
|||
208
Garykom
гуру
16.02.21
✎
16:33
|
(206) Для погружения достаточно знать что любую лямбду можно заменить на обычную Функцию или Процедуру (с передачей параметров по значению)
Но будет "больше кода" и не так "синтаксически сахарно красиво" |
|||
209
Garykom
гуру
16.02.21
✎
16:34
|
(208) тьфу *с передачей параметров по ссылке
|
|||
210
Serginio1
16.02.21
✎
17:17
|
(208) не всегда. Переменные метода по ссылке не передашь, так как время жизни лямбды может быть больше чем время жизни метода
|
|||
211
Ненавижу 1С
гуру
16.02.21
✎
17:23
|
(208) вообще нет
1. при замыкании мы конструируем функцию, но вовсе ее не вызываем, возможно вызовем вообще в другом методе, как бы с параметром такое не выйдет 2. нарушилась бы сигнатура функций |
|||
212
Почему 1С
16.02.21
✎
17:28
|
(206) Что за книжка, автор или название?
|
|||
213
Ненавижу 1С
гуру
16.02.21
✎
17:34
|
По крайней мере LINQ мог бы избавить от вот такого:
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%УсловиеОрганизация%", УсловиеОрганизация); |
|||
214
Garykom
гуру
16.02.21
✎
17:36
|
(210) (211) Дык вы читать то умеете?
ВСЕГДА лямбду можно заменить на вызов процедуры/функции, просто будет не так красиво. Придется например в временем жизни и сохранением параметров что то допом в коде изобретать да. |
|||
215
Garykom
гуру
16.02.21
✎
17:38
|
(214)+ Это как "можно ли программировать не используя GOTO"
Можно! Но иногда с "безусловным переходом по метке" проще. Аналогично с лямбдой. |
|||
216
Garykom
гуру
16.02.21
✎
17:40
|
Имхо для простоты поддержки λ=goto
лучше не использовать или новичкам особенно тяжко будет |
|||
217
Ненавижу 1С
гуру
16.02.21
✎
17:41
|
(214) и получается скрытый объект с методом в виде самой лямбды и полями в виде переменных замыкания
что собственно и проделывает, например, C# (215) конечно можно, не используя ЯВНО GOTO, но осознавая что за всеми ветвлениями и циклами лежит JMP |
|||
218
Garykom
гуру
16.02.21
✎
17:42
|
Кстати LINQ лишняя ненужная хрень, лучше нативный SQL разрабу подучить с особенностями реализаций конкретных серверов SQL
Или перейти на концепцию NoSQL с MapReduce понимая что это и зачем. А не извращаться с трансляторами. |
|||
219
Ненавижу 1С
гуру
16.02.21
✎
17:43
|
(218) каждому своё
|
|||
220
Serginio1
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# программистам которые эту хрень используют. Пока еще реляционные базы никто не вытеснит. |
|||
221
Garykom
гуру
16.02.21
✎
17:59
|
(220) Смысл SQL в том что легким движением мы можем сменить СУБД
|
|||
222
Garykom
гуру
16.02.21
✎
18:01
|
(221)+ Достаточно перед каждым вызовом добавить обработку текста sql чтобы особенности конкретной субд учесть
ну там limit или top и прочее типа передачи параметров короче это пишется за полдня для каждой новой субд |
|||
223
Garykom
гуру
16.02.21
✎
18:04
|
(222)+ имхается уже есть готовые написанные модули для трансляции текстов sql запросов между разными популярными субд
|
|||
224
Доктор Манхэттен
16.02.21
✎
18:22
|
(174) Какой же это link? Первый вариант - это обычная запись, без всякого линка. То что Линк имеет такой же синтаксис - это его проблемы. А я всегда так писал.
|
|||
225
Serginio1
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); |
|||
226
Serginio1
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; И на чем ты писал? |
|||
227
Garykom
гуру
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 можно так склеивать, но склейка происходит по функции "И", а не "ИЛИ".
|
|||
230
Serginio1
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 синтаксис более лаконичный и читаемый |
|||
231
Serginio1
16.02.21
✎
20:25
|
(230) Что бы понятнее, что для SQL применяются деревья выражений а не лямбда функции пример расширения between
https://stackoverflow.com/questions/1447635/linq-between-operator |
|||
232
Serginio1
16.02.21
✎
20:31
|
Кстати про линк на JS
https://habr.com/ru/post/261903/ |
|||
233
Доктор Манхэттен
16.02.21
✎
20:32
|
(230) Из этого я понял что в Linq есть конструкция, которую можно применять как для работы с обычными структурами данных, так и с базами данных, в то время как без Linq приходилось использовать аналогичный синтаксис, но имеющий различия для структур и для БД. Верно?
|
|||
234
Serginio1
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. Но там примерно все то же самое.
|
|||
236
fisher
17.02.21
✎
10:06
|
(212) Real World Haskell, что ли...
|
|||
237
fisher
17.02.21
✎
10:13
|
Но не поручусь, что именно про эту слышал. Не помню. Но эта выглядит достойным кандидатом ибо изобилует примерами промышленных реализаций. А что еще нужно программисту, как не примеры? :)
|
|||
238
fisher
17.02.21
✎
10:14
|
Онлайн доступна бесплатно: http://book.realworldhaskell.org/read/
|
|||
239
fisher
17.02.21
✎
10:16
|
Опа! Оно еще и со свободными комментариями на каждый сниппет и раздел! Очень прикольный формат, как-то не сталкивался с таким.
|
|||
240
Почему 1С
17.02.21
✎
11:39
|
(239) Спасибо большое! Начал читать, как раз речь про то то что я спрашивал.
Я подозревал что нужно читать что то про функциональное программирование и даже скачал пару книг но они не пошли, а твой вариант очень хорош. Прочитаю поделюсь результатом. |
|||
241
Доктор Манхэттен
17.02.21
✎
18:02
|
Так вот ради рекламы какого сайта была затеяна вся эта беседа!
|
|||
242
fisher
17.02.21
✎
18:23
|
(241) Но красивая же подводочка, согласись!
|
|||
243
Почему 1С
18.02.21
✎
10:46
|
Почитал книжку не много, начало очень интригующее мол от вас только навыки программирования, ну читаю все понятно , понятно, потом хоп и оказывается что все что было понятно, на само деле не понятно. Перечитываю второй раз, походу функциональное программирование не мое.
|
|||
244
Garykom
гуру
18.02.21
✎
10:59
|
(243) Попробуй сначала https://ru.wikipedia.org/wiki/Регулярные_выражения изучить
|
|||
245
Почему 1С
18.02.21
✎
11:36
|
(244) Регулярными выражениями владею, периодически пользуюсь, и из последнего например было "\s+[a-zA-Z0-9а-яА-Я_]+\.[a-zA-Z0-9а-яА-Я_]+\s+В\s*\([^\)]*ВТ_ОтборыПоПрограммам[^\)]*\)" - найти все условия в тексте запроса вида '*.* в (Выбрать ВТ.Программа Из ВТ_ОтборыПоПрограммам как ВТ)'. Конечно писать их на лету не могу, но с отладчиком еще не возникало задач которые бы не смог решить.
|
|||
246
Serginio1
18.02.21
✎
15:30
|
(243) Это хаскель. Посмотри F# https://docs.microsoft.com/ru-ru/dotnet/fsharp/
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |