@Fsharp_chat

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

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

потому что там тоже obj

Evgeniy
16.10.2017
12:13:52
@gsomix ты не вспомнил? :)
Вспомнил и сразу забыл!

Google
Evgeniy
16.10.2017
12:14:44
да, тоже только что про это подумал
Обычно рекомендуется во всех внешних API прописывать явные типы.

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# использовать для генерик провайдеров?

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
У нас с @neftedollar есть план запилить простенький движок с публикацией статей из markdown на F#.
Автоматический? Почему не обычный тупой статический блог?

На первое время хотя бы.

Friedrich
16.10.2017
13:14:42
Автоматический? Почему не обычный тупой статический блог?
Тупой статический блог на F# ничем не лучше и не хуже динамического блога на F#. Потому что нахаляву генерировать его на тех же github pages всё равно не выйдет — у них там токо Jekyll.

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

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

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

Friedrich
16.10.2017
13:16:08
Сгенерировал, залил.
А вот так я делаю в https://github.com/ForNeVeR/Jabber-Net/tree/develop/docs

Есть же Fornax.
Нормас, берём!

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, наверное.

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
@gsomix Спасибо большое, учту :)
А? Что? Я тут ни при чем.

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

Friedrich
16.10.2017
14:07:23
Кто тут!

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

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
Можно (пытаться) использовать то, что из них получится :)

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