
Igor
16.10.2017
14:25:37
Смотрите, перевод статьи из блога Марка Симанна
https://habrahabr.ru/company/jugru/blog/340178/

Roman
16.10.2017
14:26:19

Vasily
16.10.2017
14:26:40

Evgeniy
16.10.2017
14:26:44

Google

Roman
16.10.2017
14:27:09

Vasily
16.10.2017
14:27:25
С генеративными провайдерами одна большая засада

Roman
16.10.2017
14:27:45

Vasily
16.10.2017
14:28:27
Чисто концептуально - на основании каких данных их генерить на том же CI сервере, если, допустим, нет доступа к боевым данным

Igor
16.10.2017
14:28:33

Evgeniy
16.10.2017
14:28:49

Roman
16.10.2017
14:28:55

Vasily
16.10.2017
14:29:07
В большинстве случаев
Для скриптов такой подход ок

Roman
16.10.2017
14:29:30

Vasily
16.10.2017
14:30:15
Ну а дальше начинаются чудеса с эксепшнами

Google

Vasily
16.10.2017
14:30:42

Evgeniy
16.10.2017
14:31:17
Rezoom.SQL генерирует типы по описанию миграций.

Vasily
16.10.2017
14:32:23
А описания миграция он откуда берет?

Friedrich
16.10.2017
14:32:30
Ты ему пишешь.

Vlad
16.10.2017
14:32:39

Friedrich
16.10.2017
14:32:42
Ну то есть это SQL-скрипты.

Vasily
16.10.2017
14:33:05
Нда
Выглядит довольно шатко

Friedrich
16.10.2017
14:33:20

Vlad
16.10.2017
14:33:20
По крайней мере я не понял куда копать чтобы sqlprovider без бд работал

Vasily
16.10.2017
14:33:39
Хотя если ему подсунуть скрипт DB project, возможно, что и сожрет

Evgeniy
16.10.2017
14:34:08
Vasily Я к тому, что это особенности реализации.
А не принципиальные ограничения провайдеров.

Vasily
16.10.2017
14:34:39
@gsomix это я понимаю. Просто из вот таких вот частностей складывается всякая фигня

Vlad
16.10.2017
14:34:42

Vasily
16.10.2017
14:34:50

Vlad
16.10.2017
14:35:01
Вот в этом и проблема :/

Friedrich
16.10.2017
14:35:09
Это не принципиальные ограничения, а скорее стратегический вопрос — что делать, если билд внезапно начинает зависеть от базы или ещё чего-то внешнего по отношению к коду.

Google

Vasily
16.10.2017
14:35:34
В теории, в качестве наркомании, можно брать сборку с контрактами
Неважно какими

Vlad
16.10.2017
14:35:43
Без хранения реальных данных подключения к бд прямо в коде магия не работает

Vasily
16.10.2017
14:35:50
И генерировать тп для доступа в любой источник данных

Friedrich
16.10.2017
14:36:28

Vasily
16.10.2017
14:36:33
Неважно, sql, http etc

Evgeniy
16.10.2017
14:36:37

Friedrich
16.10.2017
14:36:40
Мне, например, очень нравится работать с XML :)
А про БД — ну, тут возможно несколько стратегий

Vasily
16.10.2017
14:37:01
Хммм

Evgeniy
16.10.2017
14:37:05

Vlad
16.10.2017
14:37:06
Вот бы типы сгенерить и сказать, что "нинада" мне ничего с этим делать. Hot reload убрать.

Friedrich
16.10.2017
14:38:34
Например, во время разработки подключаем провайдер к настоящей базе, а для билда готовим другую конфигурацию — сериализуем структуру БД куда-то (в dbml, в SQL, да хоть бинарно). Используем сериализованную структуру БД для билдов на билд-сервере и тестов, используем реальную БД только при разработке (для более быстрых итераций).

Evgeniy
16.10.2017
14:39:10

Vasily
16.10.2017
14:39:12
Остальсь понять, как в tp имплементировать мапперы

Dmitry
16.10.2017
14:39:54
Люди, а что надо применять к списку чтоб...
Короче, есть список чисел
Нужно получить список чисел = сумме чисел оригинального списка но не больше лимита.
Т.е.
[1, 5, 8, 5, 4, 3, 3] => [6, 8, 9, 6] (при лимите = 10). Это как-то fold/reduce надо прикрутить?
А, понял, пока формулировал вопрос, спасибо :)

Vasily
16.10.2017
14:40:56
Это такая хитрая свертка?
Там засада будет с нахождением последнего элемента, если что

Google

Vasily
16.10.2017
14:42:05
Если аккумулятор - список

Friedrich
16.10.2017
14:51:34
Трансдусер!

Vasily
16.10.2017
14:52:14

Evgeniy
16.10.2017
14:52:33

Friedrich
16.10.2017
14:52:42
Кажись, кто-то придумал, как их притащить в строго типизированный язык.
\o

Vasily
16.10.2017
14:57:34
Ма Вакансии в другом чате, если что

Dmitry
16.10.2017
15:12:35
Люди, а что надо применять к списку чтоб...
Короче, есть список чисел
Нужно получить список чисел = сумме чисел оригинального списка но не больше лимита.
Т.е.
[1, 5, 8, 5, 4, 3, 3] => [6, 8, 9, 6] (при лимите = 10). Это как-то fold/reduce надо прикрутить?
вроде как-то так
let rec trickyFold (list: int List) max acc =
match list with
| head::tail ->
match acc with
| [] ->
trickyFold tail max [head]
| accHead::accTail ->
match accHead+head > max with
| true ->
let newAcc = head::acc
trickyFold tail max newAcc
| false ->
let newAccHead = head+accHead
let newAcc = newAccHead::accTail
trickyFold tail max newAcc
| [] -> acc
let a = [|1; 2; 5; 5; 7; 8; 2; 4; 5|] |> List.ofArray
let f = trickyFold a 10 List.empty

Vasily
16.10.2017
15:23:18
При подобном подходе порядок же теряется
Или нет?
Рекурсия еще
Жосско

Dmitry
16.10.2017
15:24:09

Igor
16.10.2017
15:24:40


Friedrich
16.10.2017
15:24:51
Ну, в общем, мне показались интересными вот эти разрозненные факты.
(Пишу не только для Романа — он-то почти всё это наверняка и так знает, а остальным может быть интересно.)
1. Провайдеры типов — это не фича компилятора F# в чистом виде. У этого механизма есть две части: одна живёт в компиляторе, а вторая живёт в Type Provider SDK (который нужно подключать ко всем создаваемым провайдерам). Можно писать провайдеры, не пользуясь SDK, но это (кажется) сложнее.
2. Существуют т.н. generative и erased-провайдеры. Generative-провайдеры создают настоящие типы, которые потом можно увидеть и из других языков, если подключить к ним F#-сборку. Erased-провайдеры ближе к макросам, поскольку сгенерированные типы и методы заменяются в итоговой сборке на код, который находится внутри них — можно сказать, что они сразу инлайнятся.
3. Забавный факт: изначально провайдеры типов вообще создавались не как механизм, работающий исключительно с F#-кодом. Generative-провайдеры типов появились для того, чтобы код можно было генерировать на других языках, и отдавать нашему компилятору готовые сборки. Подробнее от Сайма тут: https://github.com/Microsoft/visualfsharp/issues/2406#issuecomment-335328819
4. API для generative- и erased-провайдеров почти не отличается — основная часть поведения регулируется одним флагом, который передаётся при создании провайдера.
5. Чтобы написать свой провайдер типов, нужно включить в проект несколько файлов из Type Provider SDK. Не подключить библиотеку, а именно включить файлы — например, скопировав их. Это поначалу кажется весьма неаккуратным, но было сделано специально чтобы не добавлять DLL-зависимостей в провайдеры. На практике больших проблем не вызывает, поскольку народ делает это достаточно аккуратно (например, с помощью Paket), так что копипаста не процветает.
6. Generative-провайдеры во время своего выполнения создают настоящую .NET-сборку (которая включает в себя только сгенерированные типы), и отдают эту сборку компилятору в виде массива байтов. Компилятор на своей стороне разбирает эту сборку и копирует типы из неё в результирующий код (который будет включать в себя как сгенерированные типы, так и пользовательский код, к которому этот тайп-провайдер был подключен). Долгое время это создавало проблемы для работы generative-провайдеров в окружениях, в которых нельзя сохранять сгенерированные сборки (.NET Core), и только недавно Дон Сайм перенёс часть кода из компилятора в Type Provider SDK, чтобы окончательно решить эту проблему. В ближайшее время у нас начнут работать все провайдеры под .NET Core.
https://fornever.me/posts/2017-10-16-fsharp-type-providers_ru.html


Dmitry
16.10.2017
15:25:14

Friedrich
16.10.2017
15:25:45
Немудрено тут запутаться :)

Google

Vasily
16.10.2017
15:26:22
По идее так
fun (acc,head) x->if(head+x<max) (acc,head+x) else (acc::[head],x)
про склейку массивов точно не помню синтаксис
Хотя неправильно
Косой пример
С другой стороны
Ничто не мешает в конце преобразовать acc
Типа x,y-> List.cons ([y])

Friedrich
16.10.2017
15:29:24

Vasily
16.10.2017
15:29:46
Или Concat
Из достоинств - нет рекурсии, один проход

Nikolay
16.10.2017
15:30:12

Vasily
16.10.2017
15:30:16
Из недостатков - финальный результат надо преобразовывать

Friedrich
16.10.2017
15:30:36
Грид же надо запилить.
Но DSL тоже надо.

Vasily
16.10.2017
15:31:16
XAML через билдеры?
Извращенцы

Friedrich
16.10.2017
15:31:34
Я видел подобную штуку (билдеры для UI в функционально-ориентированном языке) в Scala-FX, и результат выглядит вполне достойно.

Nikolay
16.10.2017
15:32:24