
Aleksander
20.03.2018
15:21:54

Evgeniy
20.03.2018
15:22:09

Pavel
20.03.2018
15:22:55

Evgeniy
20.03.2018
15:29:39

Google

Evgeniy
20.03.2018
15:30:46
У них там ещё мутный договор оферты.

Vlad
20.03.2018
16:33:00
https://github.com/fsprojects/FSharpLint/blob/master/README.md
Не знал о такой штуке

Evgeniy
20.03.2018
17:53:27
https://twitter.com/JetBrainsRider/status/976151384432300032
Upgraded support for F# scripting:
- Navigation commands such as Search Everywhere, Go to Symbol, Go to File Member, Find Usages, and Viewing File Structure, and as well as #load directives, all work correctly.
- Smart Code Completion for files in directives provides all the applicable files from subdirectories and inserts the relative path.
- Code Completion, highlighting, and analysis work as expected.
@auduchinok ?

Vlad
20.03.2018
18:22:56
Когда ж релиз

Eugene
20.03.2018
18:50:27
@auduchinok ?
Остались порядок файлов и мультитаргетинг из обещанного родмапа. :)

Roman
20.03.2018
18:55:18

Eugene
20.03.2018
18:58:16
Пока не придумал, зачем. У нас будет drag-and-drop для редактирования порядка.
Хотя идея про "подвинь, насколько можешь" интересная.

Ivan
20.03.2018
19:22:46
@auduchinok
Больше всего не хватает ренейма типов и типов над функциями.
Кстати 15.6.3 студия опять с багами. Теперь мультитаргетинг в проетах отвалился.. Билд не проходит нормально.

Google

Ivan
20.03.2018
19:25:01
Правда это С№

Eugene
20.03.2018
19:25:10
Ivan
И то, и другое сейчас в планах на 2018.2.
Для последнего жду поддержки в API решарпера/райдера.

Ivan
20.03.2018
19:28:22
То есть этого куска из идиа еще не прокинули?

Eugene
20.03.2018
19:29:24
Ага. И тут нужно этому сначала научить решарпер, а потом прокидывать в идею.

Ivan
20.03.2018
20:23:28
А не проще было нучить идию кушать langauge service, а уже из него выбрасывать общий интерфейс для решарпера?
Тут заодно кучу готовых для вс коде подтянуть можно ?

Evgeniy
20.03.2018
20:24:31

Ivan
20.03.2018
20:24:55
Сервисов. Там под раст и под что то еще есть

Evgeniy
20.03.2018
20:43:18
https://twitter.com/zaid_ajaj/status/976157720331120640

Roman
20.03.2018
22:30:47

Evgeniy
21.03.2018
03:46:11
Привет.

Vladimir
21.03.2018
06:48:45
Обновил вчера студию, думал пофиксили билд проекта с ресурсами, фиг там)
Error writing code fragment: System.Exception: Language name must be F#
at Microsoft.FSharp.Build.WriteCodeFragment.Microsoft-Build-Framework-ITask-Execute()

Roman
21.03.2018
07:00:28

Vladimir
21.03.2018
07:05:31
Ну у меня открывается, через студию билд тоже работает, только через dotnet build не работает как и раньше

Eugene
21.03.2018
08:03:51
А откуда в проекте берутся F# build targets и FSharp.Core.dll? Если используется FSharp.Compiler.Tools и FSharp.Core из нюгетов, то проблем быть не должно.
Много старых шаблонов рассчитывали на то, что эти файлы живут в SDK из студии, но в обновлении папка с SDK переехала, сломав старые шаблоны.
Они все запороли,у меня теперь обычный фшарп проект не открывается

Evgeniy
21.03.2018
08:14:31
> Since then, it's been a long process where we didn't just decide to implement C# as a subset of F# - that would be one way you could do it
O_o
Интересное получилось бы решение.

Friedrich
21.03.2018
08:16:25

Google

Friedrich
21.03.2018
08:16:34
(ну, наверное, старый C# теперь уже)

Evgeniy
21.03.2018
08:23:27
В итоге получилось, довольно неплохо. Хотя ОО часть выглядит совсем непривычно для тех, кто приходит из C#.
С одной стороны концептуальные правильные вещи, вроде явного self-referential связывания через бесконечные __, x, this, параметризация вместо наследования, иммутабельность.
С другой — неприятные синтаксические решения. Ну, кто помнит, как ОО писать в F#? Я всегда в доку лезу.
Дизайн — это сложно. :)

Klei
21.03.2018
08:28:34

Evgeniy
21.03.2018
08:28:43

Roman
21.03.2018
08:30:10

Evgeniy
21.03.2018
08:30:36
Я вечно путаюсь, как свойства объявлять.

Roman
21.03.2018
08:30:40

??
21.03.2018
08:40:01
Стыдно спрашивать, но всё же, подскажите, пожалуйста, должен получиться метод с такой логикой:
let set (value : 'a) : string =
match value with
| :? (sbyte<a b>) as s -> "is sbyte<a b>"
| :? (int<a c>) as s -> "is int<a c>"
| :? (int<d>) as s -> "is int<d>"
| _ -> "is unknown"
Как нужно ограничить 'a или чем заменить, чтобы заработало?
Использую вот эти docs.microsoft https://docs.microsoft.com/ru-ru/dotnet/fsharp/language-reference/generics/constraints как примеры основ ограничений шаблонов, но не вижу тут как сделать ValueType<[<Measure>] 'm>.

Evgeniy
21.03.2018
08:43:57
@yerumaku А что ты пытаешься сделать?
Я не очень понимаю. a b, a c и d — это единицы измерения? Они стираются в рантайме, а :? — это рантаймовая проверка.

??
21.03.2018
08:46:09


Evgeniy
21.03.2018
08:49:56
Можно описать discriminated union.
type DomainValue =
| AB of sbyte<ab>
| AC of int<ac>
| D of int<d>
И с такой штукой как-то работать: правильно создавать, передавать, делать match.
Units of measure (UoM) в F# — это бесплатная штука для некоторой дополнительной типизации всякой арифметики. Бесплатная, потому что UoM существуют только на этапе компиляции, а потом стираются.
Если информация о единицах измерения нужна в рантайме, то, конечно, нужно работать с discriminated union, кейсы которого будут отображать величины из твоего домена.
понять какое masute и тип значения (int, float, sbyte)
Нужно помнить, что :? — это динамическая проверка типа в рантайме, которая для типов значений требует боксинга. Это плохое решение с точки зрения статической типизации. Лучше смоделировать свой домен в терминах кейсов discriminated union.

Google

Pavel
21.03.2018
08:57:40
Guid<userId> - вместо single case unions

Evgeniy
21.03.2018
08:59:41
А UoM оставил для арифметики.

Pavel
21.03.2018
09:00:10
Их значениями рекордов неудобно
Полей рекордов

??
21.03.2018
09:03:52

Evgeniy
21.03.2018
09:05:11
Просто потому, что в скомпилированной программе никаких единиц измерения нет.

??
21.03.2018
09:06:36

Pavel
21.03.2018
09:08:09
Кстати, а в 4.1 Single Case Unions сделали бесплатными?
Как в хаскеле

Evgeniy
21.03.2018
09:08:57

??
21.03.2018
09:13:42
Еще такой вопрос по DU, указывать внутри ветви числовые типы как ref это _плохо_ и возбраняется сообществом?

Evgeniy
21.03.2018
09:14:14

??
21.03.2018
09:14:35
А какая цель?
Хранить значение, потом менять значение. Идти по перезаписи ветки DU желательно?

Pavel
21.03.2018
09:14:43
Видимо цель - сделать сложно :-)

Evgeniy
21.03.2018
09:15:33

??
21.03.2018
09:29:02
Плохо и возбраняется. Лучше делать иммутабельно.
Думал над этим, ведь если нужно поменять значение в ветви DU, но внути DU всё неизменяемо, тогда придётся перезаписывать весь DU, что сводит опять к вопросу мутабельности, нормально ли так делать? Объявить ветвь как изменяемую

Evgeniy
21.03.2018
09:30:26
На низком уровне это выглядит так: принимаешь в функцию одно значение DU, возвращаешь другое.

Google

Evgeniy
21.03.2018
09:31:19
Где-то снаружи у тебя, конечно, может существовать что-то вроде хранилища значений. Ну, пусть оно будет мутабельное, это необходимое зло.

??
21.03.2018
09:33:59

Evgeniy
21.03.2018
09:35:21
ФП подталкивает создавать новый список с измененными элементами. ;)

??
21.03.2018
09:36:29

Evgeniy
21.03.2018
09:36:53
Есть ответ и на эту ситуацию.

Anna
21.03.2018
09:36:59

??
21.03.2018
09:37:35

Evgeniy
21.03.2018
09:38:43
Если и это не подходит, например, у тебя очень критический к производительности код, тогда стоит прибегнуть к мутабельности.
Стандартное правило: сначала бенчмаркаешь, потом решаешь, что делать.

??
21.03.2018
09:40:24

Evgeniy
21.03.2018
09:41:09
Например?
Ну, массивы, let mutable, ref. Вся вот эта нечисть. :)
Это вопрос баланса.

??
21.03.2018
09:41:58

Evgeniy
21.03.2018
09:42:52
Или веб-сервера, или какие-то системы обработки информации с датчиков, и так далее, и тому подобное.
В некоторых ситуациях нужно заботится о нагрузке на GC, где-то правильно располагать данные в памяти.
Для этого тоже есть свои решения.
Но правило, кажется, одно: сначала бенчмарки, потом думать. :)