@Fsharp_chat

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

Roman
16.10.2017
14:26:19
В теории можно, но через рефлексию
Стоп, для erased рефлексия недоступна. Там типы существуют только на уровне F# компилятора

Evgeniy
16.10.2017
14:26:44
Google
Roman
16.10.2017
14:27:09
Тогда печаль
Угу. Но на то есть Generative провайдеры

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
Почему все эти переводчики ещё не здесь? :)
Возможно потому что это JUGru и она для продвижения DotNext с Марком

Vasily
16.10.2017
14:29:07
Стоп, ну так оно генерится при билде автоматически
Только доступ к данным должно иметь

В большинстве случаев

Для скриптов такой подход ок

Roman
16.10.2017
14:29:30
Чисто концептуально - на основании каких данных их генерить на том же CI сервере, если, допустим, нет доступа к боевым данным
Перебилдил F# либу - получил в ней обновленные типы. Ну так держи схему рядом с кодом, не вижу проблему

Только доступ к данным должно иметь
Для Json, например - взял минимальный JSON, который описывает схему, и используешь его

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

Google
Vasily
16.10.2017
14:30:42
Для Json, например - взял минимальный JSON, который описывает схему, и используешь его
Однако большинство примеров для tp - не про метаданные :)

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
Возможно потому что это JUGru и она для продвижения DotNext с Марком
Вот уж не подумал бы, что Марка придётся продвигать :)

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
dbml , например
Это же sqlserver, нет?

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
Мне, например, очень нравится работать с XML :)
Для XML есть провайдер, который генерирует по схеме, кстати.

Vlad
16.10.2017
14:37:06
Магия же бывает не только для БДшных провайдеров
Не, я больше про фатальный недостаток sqlprovider

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

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

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
Пустой набор слов для меня :)
https://clojure.org/reference/transducers

Кажись, кто-то придумал, как их притащить в строго типизированный язык.

\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
При подобном подходе порядок же теряется
а, ну получается развёрнутый

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
А в чем прикол [|…|] |> List.ofArray ? Там же можно просто []
а я постоянно забываю и путаю синтаксис массивов и списков

Friedrich
16.10.2017
15:25:45
а я постоянно забываю и путаю синтаксис массивов и списков
Потому, что int[] — это массив! И [| 1; 2; 3 |] — тоже массив.

Немудрено тут запутаться :)

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
про склейку массивов точно не помню синтаксис
Array.concat какой-нибудь наверняка есть.

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? :)
Я на самом деле хотел просто так поконтрибьютить в Авалонию, без DSL.

Грид же надо запилить.

Но DSL тоже надо.

Будем думать про DSL? :)
Какие задачи ты ставишь для DSL?

Vasily
16.10.2017
15:31:16
XAML через билдеры?

Извращенцы

Friedrich
16.10.2017
15:31:34
XAML через билдеры?
Для FSharp.Desktop.UI очень ок будет.

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

Nikolay
16.10.2017
15:32:24
Какие задачи ты ставишь для DSL?
Писать гуй на F# с использованием фитчей ФП

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