Friedrich
05.11.2017
14:07:10
Ну а всякие вариации LINQ2SQL приходится тестами дебажить.
Я вот очень много в C# балуюсь LinqKit (и в F# обожаю всякие композитные запросы), а их только тестами можно отладить нормально.
Mikhail
05.11.2017
18:35:43
Реален ли язык, где типы - first-class objects и был бы от этого профит?
Igor
05.11.2017
18:36:40
Ты про завтипы?
Google
Mikhail
05.11.2017
18:36:50
Не знаю)
Igor
05.11.2017
18:37:21
Почитай про Idris
Mikhail
05.11.2017
18:37:58
Представил себе флексибилити, если можно было принимать типы и возвращать типы
Igor
05.11.2017
18:40:41
Посмотри, может проникнешся, там примерно про это
https://youtu.be/X36ye-1x_HQ
P
05.11.2017
18:45:38
А F* не о том же?
Mikhail
05.11.2017
18:59:24
Igor
05.11.2017
19:17:37
Это да, а вот практичность сего подхода под большим вопросом (для прикладных задач).
Плюс народ жалуется, что там ещё всё не стабильно (хотя 1.0 и вышел) и компилятор медленный.
А F* не о том же?
Он точно про "доказательства корректности" на уровне типов, как agda/coq/Idris, но вот есть ли там завтипы ХЗ (да и зачем это юзать если не делаешь ПО для спутников ?)
Evgeniy
05.11.2017
19:52:03
@mitutee @angmarr Про зависимые типы, кстати, отдельный чат есть. Можно там обсудить.
https://t.me/joinchat/AAAAAD9SWO_tLd7rJ9S7Ig
Aleksey
06.11.2017
04:45:31
> да и зачем это юзать если не делаешь ПО для спутников
кое чего из зав.типов начинает хотеться довольно скоро - стоит лишь пописать достаточно на языках с "предзависимыми типами". И при этом задачи могут быть совсем не космические :)
И всё же в одну корзину Coq и Idris класть не стоит
Idris - язык с зав.типами, язык общего назначения. Coq - доказывалка теорем
Google
Aleksey
06.11.2017
04:48:51
На "петухе" том же не пишут программы, на нём доказывают теорему о том, что некая программа - корректна. А потом - вжух и Coq синтезирует код на одном из языков.
И процесс доказывания довольно трудоёмок, поэтому, да, оный имеет смысл далеко не всегда - для особо ответственных кусков, разве что. Но вполне применим и на "небольших" задачах типа верификации кропто-алгоритмов или компиляторов.
А на Idris можно просто писать код - язык просто даёт больше инструментов, чем даёт, например, Haskell
F*, Agda и Idris - одного поля ягоды. Это "просто" "языки покруче" :)
Evgeniy
06.11.2017
05:27:05
@astynax Спасибо за экскурс.
Aleksey
06.11.2017
05:27:54
Много нафлудил?
Mikhail
06.11.2017
05:34:34
Aleksey
06.11.2017
05:38:33
Создавать типы "на лету" можно и в "обычных" языках, другое дело, что выразительность будет похуже и будет много ручной работы :)
Те же АТД можно конструировать из Tuple + Either.
Mikhail
06.11.2017
05:41:10
А как, например, сделать функцию, которая принимает целое число n и возвращает тип ( список ), в который можно положить лишь n элементов?
Aleksey
06.11.2017
05:41:53
Представлением n в виде числа Пеано - представлением на типах, конечно же :)
Это как раз таки сравнительно простая задача (её даже я осилю :))
Mikhail
06.11.2017
05:43:06
Пойду читать про число Пеано..
Aleksey
06.11.2017
05:43:26
Ну числа Пеано, это Zero + Succ
Zero = 0
Succ Zero = 1
Succ (Succ Zero) = 2
"Пеано на типах", это синглтон-тип Zero и Succ<a>
Таким "числом на типах" можно уже параметризовать другие типы, например тип списка - получится "список с длиной"
Mikhail
06.11.2017
05:46:09
Нужно писать свой тип списка?
Aleksey
06.11.2017
05:46:16
Конечно :)
data List l a = Cons (Succ l) (List l a) | Nil Zero не совсем, но близко (тут GADT нужны, думаю)
Google
Aleksey
06.11.2017
05:49:54
Если список представить сразу в виде пар, то он по построению будет иметь известную длину. Но длинные списки будут выглядеть громоздко, конечно.
Friedrich
06.11.2017
06:01:50
https://github.com/mausch/TypeProviderPlayground/blob/0b8958cf04bf9316754771da894a1f81b42e8fb5/TypeProviderPlayground/PeanoProvider.fs
Было непросто, но выкопал ссылку из архива.
Aleksey
06.11.2017
06:03:04
Я видел "рогалик" в виде тайп-провайдера с выводом "картинки" в докстринге. Так что числами Пеано меня не напугаешь :)
Friedrich
06.11.2017
06:03:25
Ну, рогалик-то как раз понятно как сделать.
Там большого ума не нужно!
(да, на самом деле нужно, но всё равно механизм понятный)
Aleksey
06.11.2017
06:04:18
Так это же просто программа, вызываемая из ide в design time
Friedrich
06.11.2017
06:04:32
Ну, не совсем.
Это программа, которая должна отдавать набор типов. С этим связана специфика и ряд внутренних ограничений. Например, то, что она не все возможные типы может генерировать.
(надо бы этим вопросом будет как-нибудь заняться и починить?)
А вот провайдер для Пеано, да к тому же такой коротенький, может быть и полезным, и одновременно хорошим пособием при изучении провайдеростроения.
Aleksey
06.11.2017
06:07:08
Состояние кодируется в самом типизируемом выражении, а выводить можно тот же тип, что был на входе. Получается рекурсия с состоянием :)
Evgeniy
06.11.2017
06:08:36
Я видел для F# тайп-провайдер с Пеано на типах.
Пример без провайдеров, но с привлечением литералов.
https://github.com/palladin/fsharp-snippets/blob/master/src/FSharpSnippets/Generic%20Numeric%20Literals%20and%20Compile%20time%20Peano%20arithmetic.fsx
Friedrich
06.11.2017
06:11:08
Тоже интересно!
Что такое 1G? Как это вообще работает? %)
https://sergeytihon.com/2014/01/11/f-kung-fu-2-custom-numeric-literals/ — ок, нашёл в блоге у Сергея. Я вообще не знал про эту фичу.
Evgeniy
06.11.2017
06:15:59
Friedrich
06.11.2017
06:18:45
Google
Friedrich
06.11.2017
06:18:53
Это полезно.
Evgeniy
06.11.2017
06:24:29
Vladimir
06.11.2017
06:52:08
А делал кто-нибудь cqrs с read и write базами?
Evgeniy
06.11.2017
08:01:17
Напиши.
1. Support generic provided type definitions
Нет положительного решения. Текущее состояние описано в спецификации F#:
Provided type and method definitions may not be generic.
https://github.com/fsharp/fslang-suggestions/issues/274
2. Support provided union and record types
Approved in principle. Нет ни RFC, ни прототипа.
https://github.com/fsharp/fslang-suggestions/issues/154
3. Allow intrinsic type extensions for provided types
Approved in principle. Есть прототип, но нужен RFC.
https://github.com/fsharp/fslang-suggestions/issues/509
4. Allow type providers to generate types from types
Approved in principle. Есть RFC и прототип.
https://github.com/fsharp/fslang-design/blob/master/RFCs/FS-1023-type-providers-generate-types-from-types.md
5. Allow quotation expressions as type provider arguments
Нет положительного решения.
In UserVoice, Don Syme noted that this will "almost certainly require #212 (Allow type providers to generate types from types) to be fully implemented".
https://github.com/fsharp/fslang-suggestions/issues/450
Это самое важное, на мой взгляд.
Есть еще пара интересных вещей, которые могут быть полезны для провайдеров.
Improve support for staging in F# quotations
https://github.com/fsharp/fslang-suggestions/issues/584
Немного раздражает руками собирать некоторые деревья выражений.
Type Provider Combinator Experiments
Старый незаконченный, но интересный проект. С последними изменениями в TP SDK, наверное, нужно очень много обновлять.
https://github.com/fsprojects/TPCombinators
@nevoroman Может быть тоже будет интересно. ^
Admin
Roman
06.11.2017
08:37:21
Evgeniy
06.11.2017
08:37:41
Roman
06.11.2017
08:38:16
Возможно, расскажу в докладе и постараюсь привлечь комьюнити реализовывать это все :)
Ну или после доклада
Friedrich
06.11.2017
08:42:00
Лучше после доклада, наверное. Не думаю, что стоит подсвечивать недоделки на самом докладе. Это может оставить смешанное впечатление :)
Roman
06.11.2017
08:47:24
Скрывать недоделки тоже не всегда хорошо. А озвучить можно как "а вот еще что будет реализовано".
Я скорее за тайминг переживаю, фатально не хватает времени на то, чтобы рассказать про все интересное
Friedrich
06.11.2017
08:58:12
Скрывать недоделки однозначно нельзя, но и как-то особенно выделять их тоже не стоит. А все, о чём говорится в докладе, по определению «особенно выделяется».
Evgeniy
06.11.2017
09:13:58
Allocations are not always your enemy.
https://github.com/vasily-kirichenko/CoreApp33
> CoreApp33
Vladimir @fvnever Что скажете по этому бенчмарку?
Google
Friedrich
06.11.2017
09:21:40
Вариант с аллокациями работает быстрее, чем с пулом.
Evgeniy
06.11.2017
09:22:17
Friedrich
06.11.2017
09:23:03
ArrayPool.Shared.Rent — о, а это уже в стандартной либе чтоли?
https://github.com/dotnet/corefx/blob/master/src/System.Buffers/src/System/Buffers/ArrayPool.cs
Evgeniy
06.11.2017
09:26:36
Ок, я нашел бенчмарки.
http://adamsitnik.com/Array-Pool/
Да, действительно, для небольших массивов ArrayPool работает медленее аллокаций.
Vladimir
06.11.2017
09:32:35
Аллокации всегда быстро работают, малину портит только GC. Не очень понятно в этом бенчмарке где GC
Т.е. у Адама Ситника понятно) У Василия не понятно.
Evgeniy
06.11.2017
09:37:24
Vladimir
06.11.2017
09:43:21
Ну и с точки зрения сервера тут тоже неясно даже про маленькие массивы. Там нулевое поколение можеть быть до 4GB и когда его чистишь у юзеров таймауты.
Evgeniy
06.11.2017
09:46:50
Как обычно, надо бенчмаркать.
В каждом конкретном случае.
Vladimir
06.11.2017
09:49:50
было бы интересно на max-min и моду посмотреть, по идее с аллокациями должен быть гораздо сильней разброс на вызовы которые попадают на GC
если так и есть, то это выбор между лучшей стабильностью и суммарной лучшей производительностью
я вот например когда тестил wcf vs asp.net core это как раз и видел, wcf работает в 2 раза быстрей в целом, но запросы которые приходятся на GC в 2 раза медленней в итоге обрабатываются
Friedrich
06.11.2017
12:18:28
Кто-нибудь, кроме меня, работал с Freya? У меня чёт не получается сделать редирект. Написал такое:
freyaMachine {
movedPermanently true
handleMovedPermanently (freya {
do! Freya.Lens.setPartial Response.Headers.Location_ (Location(UriReference.parse "/"))
return Representation.empty
})
}
Но этот мой хендлер в handleMovedPermanently почему-то вообще не вызывается.
Я долго смотрел на диаграммы состояний в документации https://docs.freya.io/en/latest/_static/specifications.responses.html, но по ним так и не понял, почему у меня не работает :(
Ага, в гиттере подсказали: для того, чтобы работали редиректы, нужно добавить к определению машины exists false.
Evgeniy
06.11.2017
14:09:15
Привет.
https://twitter.com/oss_fsharp/status/927529742215077888