
Evgeniy
16.10.2017
12:13:09
Pavel Можешь для диагностики расписать конкретные типы у аргументов конструктора?

Pavel
16.10.2017
12:13:20
да, тоже только что про это подумал
потому что там тоже obj

Evgeniy
16.10.2017
12:13:52

Google

Evgeniy
16.10.2017
12:14:44

Pavel
16.10.2017
12:17:03
type MessagingManager<'C> ( cts: CancellationTokenSource,
raftRequestProcessor : RequestData<'C> -> Async<SenderInfo * ResponseMessage>,
raftResponseProcessor : ResponseProcessingResult<'C> -> unit,
config : RaftConfig) as self =

Evgeniy
16.10.2017
12:17:47
Теперь, наверное, нужно осмотреть код рядом с вызовом этих функций.

Pavel
16.10.2017
12:19:15
а не является ли вывод типов поверх явно прописанных ошибкой само по себе?

Evgeniy
16.10.2017
12:21:11
Нет, не является. Вывод типов нужно рассматривать не как уточнение отсутствющих типов, а скорее как разрешение типов для всего кода сразу.
Если компилятор по каким-либо причинам не может такую задачу разрешить, то появляются стремные ошибки. :)
Иногда бывает сложно проследить явные зависимости в том, как компилятор выводит типы.
Поздний код влияет на более ранний, и наоборот.

Pavel
16.10.2017
12:24:19
понятно, ок, значит надо не что-то непонятное ловить, а тупую ошибку

Evgeniy
16.10.2017
12:24:28
Pavel Я бы это отлаживал так: сначала закомментировал бы все, потом добавлял код и смотрел, как это влияет на вывод.

Pavel
16.10.2017
12:24:54
спасибо, видимо, уже завтра буду тырситься с этим :)

Evgeniy
16.10.2017
12:25:04

Google

Pavel
16.10.2017
12:25:28
ок, постараюсь сделать маленький пример, как разберусь


Friedrich
16.10.2017
13:03:18
Доброго дня, товарищи!
Такой вопрос - вы тут недавно ковырялись в провайдерах и мне бы хотелось знать, какие неожиданные или неочевидные штуки вы при этом встречали?
Как обычно, интересуюсь с корыстными целями использования в докладе :)
Ну, в общем, мне показались интересными вот эти разрозненные факты.
(Пишу не только для Романа — он-то почти всё это наверняка и так знает, а остальным может быть интересно.)
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.
Простите, если немного разорвал чат :)


Artemy
16.10.2017
13:06:55
Схоронить бы такое куда-нибудь


Nikolay
16.10.2017
13:07:00
Ну, в общем, мне показались интересными вот эти разрозненные факты.
(Пишу не только для Романа — он-то почти всё это наверняка и так знает, а остальным может быть интересно.)
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.
Вот, копирование файлов это печально


Artemy
16.10.2017
13:07:08
Хоть на сайт добавляй

Evgeniy
16.10.2017
13:07:17
#паста

Artemy
16.10.2017
13:08:00
Прямо на статейку для блога тянет.)
Краткую, но полезную.

Friedrich
16.10.2017
13:08:27
«шесть ШОКИРУЮЩИХ фактов о провайдерах типов»

Artemy
16.10.2017
13:08:43
О, и название уже есть. ?

Vasily
16.10.2017
13:08:46
@fvnever теперь вопрос - результирующую сборку же можно из c# использовать для генерик провайдеров?

Friedrich
16.10.2017
13:08:57

Nikolay
16.10.2017
13:09:02

Vasily
16.10.2017
13:09:07
Как все шоколадно
Осталось только вкорячить генерацию типов из метаданных
Хотя вроде sql такие есть провайдеры
Которые dbml жрут

Evgeniy
16.10.2017
13:10:23

Aleksandr
16.10.2017
13:10:51
Ошибся чатом, прошу прощения

Google

Artemy
16.10.2017
13:11:03

Evgeniy
16.10.2017
13:11:43
@fvnever Я бы еще приправил это описание ссылками. И это действительно достойно статьи.

Friedrich
16.10.2017
13:11:58
Ну блог сайту нужен.
Мы на самом деле хотели прикрутить (как в том же ruhaskell сделано — уж больно мне нравится), но просто у нас рук на всё не хватает :(

Artemy
16.10.2017
13:12:32
Вообще, хороша ли идея перенести сайт на какую-нибудь CMS (например, www.orchardproject.net)? Тогда контентом управлять проще будет, наверное.
P.S.: Сам с вебом не работаю, но что из себя CMS представляет, более менее в курсе. :)
Там просто готовый движок блога должен быть.

Evgeniy
16.10.2017
13:13:01
Я думаю, тут даже статически генерируемый блог подойдет.

Friedrich
16.10.2017
13:13:07
Мой персональный бложик (https://github.com/ForNeVeR/fornever.me реклама бесстыдна) уже так и работает.

Evgeniy
16.10.2017
13:13:58
На первое время хотя бы.

Friedrich
16.10.2017
13:14:42

Artemy
16.10.2017
13:15:03
Ну в случае с CMS и пилить ничего не нужно. Вроде как более быстрый вариант. Только там тему сайта настроить.

Evgeniy
16.10.2017
13:15:05

Friedrich
16.10.2017
13:15:09
Ну то есть мне лично без разницы, можно на FSharp.Formatting сделать генератор и будет ок, я всеми руками «за».

Evgeniy
16.10.2017
13:15:14
Сгенерировал, залил.

Friedrich
16.10.2017
13:15:30

Evgeniy
16.10.2017
13:16:05

Friedrich
16.10.2017
13:16:08

Artemy
16.10.2017
13:16:43
У меня была мысль, что можно CMS на WebSharper сделать. Но чересчур масштабно для одного, да ещё и не веб-разработчика. :)

Google

Friedrich
16.10.2017
13:17:46
А материал я перелью, наверное, себе в бложик всё-таки. Была такая мысль. Позже, когда раздел со статьями для fsharplang.ru будем делать, я туда этот материал задоначу :)

Evgeniy
16.10.2017
13:26:12
Я попробую в свободное время посмотреть Fornax, наверное.

Nikolay
16.10.2017
13:26:51

Evgeniy
16.10.2017
13:27:03

Nikolay
16.10.2017
13:27:30

Evgeniy
16.10.2017
13:30:50
Посмотри Fornax. :)
А я еще давно хочу личный блог собрать. Может и мне пригодится в итоге.

Vasily
16.10.2017
13:56:25
Чет появилась одна наркоманская идея
Сделать тайп провайдер, который генерирует билдеры

Sergey
16.10.2017
13:59:21
Посмотри Fornax. :)
еще можно посмотреть https://github.com/fable-compiler/static-page-generator )

Roman
16.10.2017
13:59:51
Котрые генерируют фабрики абстрактных классов, с виртуальными методами, позволяющими переопределить реализацию методов интерфейсов, которые эти абстрактные классы реализуют)
Больше абстракций богу абстракций)
/шутка)

Vasily
16.10.2017
14:00:18
Java там —----->

Roman
16.10.2017
14:00:41
Но но - дотнет ван лав.

Vasily
16.10.2017
14:01:00
Больше абстракций богу абстракций- это в яву

Roman
16.10.2017
14:01:45
да то шутка была, не более)

Evgeniy
16.10.2017
14:02:50

Roman
16.10.2017
14:06:12
@gsomix Спасибо большое, учту :)

Evgeniy
16.10.2017
14:06:53

Google

Evgeniy
16.10.2017
14:07:09
Ты имел в виду @fvnever?

Friedrich
16.10.2017
14:07:23
Кто тут!
@nevoroman я советую к докладу приготовить обстоятельный ответ на вопросы про .NET Core. Сам понимаешь, тема достаточно хайповая, и наверняка про неё спрашивать будут — когда же провайдеры, наконец, под .NET Core заработают :)

Sergey
16.10.2017
14:13:41

Friedrich
16.10.2017
14:14:25
Маленько уже осталось и всё заработает.

Roman
16.10.2017
14:21:03
На это уже есть отдельный слайд!
Как же, как же без неткора!

Friedrich
16.10.2017
14:22:12
Просто это вопрос, который сильно мешает евангелировать за F#. Обязательно найдётся кто-нибудь, кто знает про проблемы с неткором (или просто добросовестно интересуется), и будут неудобные вопросы!
Но теперь уже удобные, ха :)

Vasily
16.10.2017
14:22:38
Главное, чтобы не было неудобных ответов

Friedrich
16.10.2017
14:22:45
Да, это верно.

Roman
16.10.2017
14:22:49
Вот да

Vasily
16.10.2017
14:23:00
С моей точки зрения, важен не столько неткор, сколько интеграция с тем же с#

Roman
16.10.2017
14:23:08
Неудобные вопросы - это нормально, это вообще одна из целей доклада

Vasily
16.10.2017
14:24:29
Еще вопрос - интеграция всего этого добра в билд систему

Roman
16.10.2017
14:24:31
Вернее, erased могут работать в F# либе, но использовать типы в C# коде нельзя

Vasily
16.10.2017
14:24:49
В теории можно, но через рефлексию

Friedrich
16.10.2017
14:24:51
Можно (пытаться) использовать то, что из них получится :)