@Fsharp_chat

Страница 682 из 772
Alexey
28.08.2018
19:31:26
я местами и XSLT пользую в десктопе, технология с другим стилем мышления в любом случае в копилке лишней не будет

Ayrat
28.08.2018
19:32:11
C# умеет в goto (в F# где ВСЁ является выражением встроить императивный переход на выполнение стейтмента явно непросто))) И ещё C# умеет в protected (сделать его очевидно элементарно, но дизайн F# против наследования реализации поэтому protected нет и не будет)

всё остальное (stackallock, nativeptr, unsafe, marshalling, PInvoke, extern) есть в обоих

Alexey
28.08.2018
19:33:08
что умеет C# я знаю :)

Google
Alexey
28.08.2018
19:33:34
завтра уже посмотрю

Ayrat
28.08.2018
19:33:52
что умеет C# я знаю :)
ну это я к тому что если захочется лоу левел интеропа он есть в F#, но если тебе нужен именно goto, то бида

Alexey
28.08.2018
19:33:52
на сегодня хватит :)

я сомневаюсь что у меня по всей кодовой базе найдётся хотя бы 3 goto, и те в составе switch

а не, есть кейс - retry - 4 штуки на полмиллиона строк в проекте

и один в парсере

текста

и ещё по фшарпу

я так понял, что состояние/модель обновляется либо целиком, либо как минимум значимыми кусками не приведёт ли это к значительным накладным расходам, если надо добавлять в словарь/список в составе модели новые элементы? как в этом случае thread safity обеспечивается?

если в .NET присваивание ссылки - атомарная операция, то замена ссылки на другую ссылку потокобезопасно, но формирование нового объекта - дорогая операция в общем случае

или может структуры в стандартной библиотеке F# заточены под это дело, типа lock-free

Ayrat
28.08.2018
20:05:49
я так понял, что состояние/модель обновляется либо целиком, либо как минимум значимыми кусками не приведёт ли это к значительным накладным расходам, если надо добавлять в словарь/список в составе модели новые элементы? как в этом случае thread safity обеспечивается?
если ты работаешь с мутабельным состоянием, магии не случается, тред сейф обеспечивается точно так же в случае с иммутабельным состоянием те же структуры F# реализованы эффективненько чтобы переиспользовать старые элементы препенд к листу F# (добавление в начало) не аллоцирует новый список map и set реализованы через BST поэтому добавление нового элемента добавляет старое дерево как поддерево нового дерева и т.д.

Google
Alexey
28.08.2018
20:06:59
> препенд к листу F# (добавление в начало) не аллоцирует новый список а что со сложностью индексации?

Alexey
28.08.2018
20:07:40
то есть списки дороже чем у старшего брата

Ayrat
28.08.2018
20:07:46
не

списки у брата (насчёт старшего - спорно) это dynamic array же

Alexey
28.08.2018
20:08:04
я имею в виду List/F# vs List/C#

Ayrat
28.08.2018
20:08:14
поэтому в F# он назван подобным образом - ResizeArray

Alexey
28.08.2018
20:08:19
старшего в смысле более древнего

лет на 5

Ayrat
28.08.2018
20:09:06
ну, из фишек C# которые перекочевали в F# я могу вспомнить только гетеры/сетеры

всё остальное переезжало в обратном направлении

дженерики, асинк/евейт, всё фп (линк, query/fluent syntax, local functions, tuple deconstructions, var keyword, lambda, whatever)

а насчёт листа в C# - уёбищный нейминг дизайн команды C# давно известен

называть динамический массив Листом - это пять Но назвать map Select'ом - это десять!!!

https://en.wikipedia.org/wiki/Dynamic_array

ну и листы https://en.wikipedia.org/wiki/List_of_data_structures#Lists

даже в джаве до такого не додумались

там он как ArrayList (ну тоже такое себе, но не List же ж)

Google
Ayrat
28.08.2018
20:15:22
И да, соответствие нормального человеческого односвязного списка (List) в F# - это LinkedList в C# ResizeArray в F# = List в C# Array в F# (кстати он генерик) = Array в C# (Array<T>? не, не слышал)

Эвенты
да, соглашусь. евенты тоже

но вместе с упоротыми делегатами (вместо человеческой типизации функций как first-class citizen) мысль дизайн команды пошла настолько упорото далеко что теперь люди имеют delegate, Action и Func

Vlad
28.08.2018
20:17:30
да, соглашусь. евенты тоже
IDisposable тоже по-сути сахар C#/VB

Ayrat
28.08.2018
20:18:03
это скорее воркэкраунд для языков с GC

который необходим

Ivan
28.08.2018
20:22:32
называть динамический массив Листом - это пять Но назвать map Select'ом - это десять!!!
Есть еще 15 - SelectMany - это вообще новый термин от команды. Не bind не flatMap им не подошли ?

Кстати эвенты в F# - IObservable<T> из коробки

И к тому же имеют тип.

А ужас C# - это только бридж.

Ayrat
28.08.2018
20:24:38
Ну вот этот query syntax аля SQL он же был придуман сумрачным гением Хейлсберга, я уверен Я не считаю себя спецом в SQL, но неужто там нет множественного возврата чтобы можно было SELECT TABLE?

Ivan
28.08.2018
20:25:04
Прикинь, нету

Ayrat
28.08.2018
20:25:10
не построчно, а прям сразу тейбл

Ivan
28.08.2018
20:25:20
Нету

Ayrat
28.08.2018
20:25:29
как они там живут

Ivan
28.08.2018
20:25:36
Это ж реляционка - строго сетка

А зачем он там?

Ayrat
28.08.2018
20:26:15
вопрос хороший. Ну сахарок)

Ivan
28.08.2018
20:26:20
Там любая выборка и так просто тип сумма

Google
Ivan
28.08.2018
20:27:16
ДЖойны из коробки и оптимизированны - это сразу же и бинд. А таблицу таблиц - это к ораклу с его ООП в SQL

Ayrat
28.08.2018
20:28:42
во, точно. RIGHT JOIN мапит один элемент нашей таблицы на много-много элементов правой таблицы Итог конкатенируется в мега таблицу

Ivan
28.08.2018
20:29:20
Не только райт. Любой join по сути бинд.

Ayrat
28.08.2018
20:29:48
inner join чот не похож

любой OUTER JOIN похож на бинд, да

Ivan
28.08.2018
20:33:19
Любой. Смотри: CREATE TABLE Master ( Id INT PRIMARY KEY, Name VARCHAR(10)) CREATE TABLE Chield ( MasterId INT, Num INT, Cnt INT, PRIMARY KEY(MasterID, Num), Foreign KEY MaterID References Master(ID)) SELECT * FROM Master INNER JOIN Chield ON Id = MasterId

Ayrat
28.08.2018
20:34:10
каждому элементу из таблицы мастер будет поставлен в соответствие 0..1 элемент из чайлда, не?

Ivan
28.08.2018
20:34:39
Не 1..n

Строчек будет столько, сколько в чилде

к каждой добавиться соотвестсвующий мастер.

Ayrat
28.08.2018
20:35:42
ненене, иннер джойн - это пересечение. Если строчек столько же сколько в чилде, это (для текущего запроса) будет right join

Ivan
28.08.2018
20:36:33
LEFT OUTER возьмет еще и строки,мастера, у которых нет ни одного чайлда, но дополнит путыми значениями в конце тупла

Нересечение - это INSTERSECT

И такой оператор то же есть

Ayrat
28.08.2018
20:38:11
Как всё непросто с этим вашим сиквелом.

:D

Ivan
28.08.2018
20:38:24
RIGHT OUTER в случае форайна вернет то же что и иннер

Кстати, с точки зрения функционального программирования - чистая реляционная алгебра очень близка. В отличие от ОРМ

И Ayrat, тебе то уж немного даже стыдно с таким бекграундом, и не sql не разу ?

Ayrat
28.08.2018
20:41:29
Да я уже вовсю читаю про джойны!

Google
Ayrat
28.08.2018
20:41:36
и пепел сыплю на лысину

Ivan
28.08.2018
20:42:18
Давай, между прочим декларативные языки то же некоторую подвижку к мозгу вносят

И заодно вопрос к сообществу, какого ... F# тайп провайдеры под SQL так уиленно копируют дизайн абсолютно не понятного для фп ОРМ?

Ayrat
28.08.2018
20:46:21
Блин, inner join всё же пересечение (конечно же), но я забыл что в присоединяемой таблице может быть более 1 совпадения т.е. не 1..n, а всё же 0..n строк может присоединиться

Ivan
28.08.2018
20:46:53
Не с форайн ключом не может.

Ограничение на несуществование записей в чилд без записи в мастер

Для двух произвольных - может

Ayrat
28.08.2018
20:48:06
да, теперь всё встало на свои места. гармония во вселенной восстановлена

Ayrat
28.08.2018
21:02:59
Action и Func - тоже делегаты
Да, я об этом же.

Теперь есть 3 вида представления функций вместо одного!

Ivan
28.08.2018
21:05:52
Да не, всего два. Для статики одна, для прибинженной другая. А так все это всего навсего наш FsharpFunc без кариенга, потому и представленный как компилер фича.

Ayrat
28.08.2018
21:12:05
И bind SelectMany
Ну bind сложно, можно понять. Но map-то.

Bonart
28.08.2018
21:19:50
Теперь есть 3 вида представления функций вместо одного!
Почему три? Все есть делегат :) Другое дело, что unit и void как обычно в процедурных языках сделаны через двуликий анус

Roman
28.08.2018
21:25:51
Привет!

MrErsh
28.08.2018
21:27:14
Привет. Я тут давно, просто старый телефон потерял и зашёл с нового)

Friedrich
29.08.2018
04:23:42
там он как ArrayList (ну тоже такое себе, но не List же ж)
Потому что там List — это интерфейс (который обозначает примерно то же самое, рандомный доступ по индексу, но при этом неэффективно реализуется в LinkedList).

Страница 682 из 772