
Илья
23.05.2017
10:00:34
Вроде и понимаю что неплохо бы, а все равно влом

Artemy
23.05.2017
10:01:54
Как вариант, можно на курсы какие-нибудь записаться.

Evgeniy
23.05.2017
10:02:44
@DarkByte2016 Про bind и let! написано у Смита в главе про вычислительные выражения.

Vlad
23.05.2017
10:42:51
Желательно на русском))
Когда требуете литературу на русском нужно в 90% случаев быть готовым к тому что это перевод книги 2-3 годичной давности + ещё есть вероятность плохого переводчика и редактора. Лучше английский выучить как можно раньше

Google

Anton
23.05.2017
11:15:29
Один из хороших примеров чем лучше fsharp по сравнению с csharp это Visitor vs Discriminated Union https://stackoverflow.com/a/694822/330090

Evgeniy
23.05.2017
11:17:55
Visitor, кстати, играет ключевую роль в TypeShape.
https://github.com/eiriktsarpalis/TypeShape

Anton
23.05.2017
11:27:38
посмотрел интересно, народ из mbrace головастые, он там для rank 2 юзает тот же самый метод как и linq, класс содержит генерик метод. я когда-то писал давно монад трансформеры на c# немного по другому делал наследовал генерик класс от негенерика и давал гарантию что этот базовый класс не может иметь других наследников
телеграм глючит показывает мое сообщение в 2х экземплярах и при попытке удалить предлагает удалить оба, норм

Evgeniy
23.05.2017
11:29:23
@anton_shelin Бывает. С сообщениями все в порядке.

Anton
23.05.2017
11:29:33
ну значит ок

Pawel
23.05.2017
13:11:07

Anton
23.05.2017
13:11:36

Pawel
23.05.2017
13:12:53
DiscriminatedUnions - это просто типы суммы. они в С# реализованы традиционно наследованием от базового класса

Vasily
23.05.2017
13:13:42
Отметим - от пустого базового класса

Anton
23.05.2017
13:13:44
Отметим - от пустого базового класса
Для диспатча тебе придется туда вставлять метод Eval или если так не делать то матчить по типу рефлекшеном или делать визитор если охота компиль чек.

Pawel
23.05.2017
13:16:26
Да почти так же
switch(shape)
{
case Circle c:
WriteLine($"circle with radius {c.Radius}"); break;
case Rectangle s when (s.Length == s.Height):
WriteLine($"{s.Length} x {s.Height} square"); break;
case Rectangle r:
WriteLine($"{r.Length} x {r.Height} rectangle"); break;
default:
WriteLine("<unknown shape>"); break;
case null:
}

Google

Anton
23.05.2017
13:17:16
Ага я добавлю новый класс наследник и как компилятор мне подскажет что этот класс не покрыт?
Суть в компиль тайм чеке.

Pawel
23.05.2017
13:20:59
Компилятор нет, но все щас пользуют решарпер, а он скажет обязательно. Суть в том, что это не есть какая-то там киллер фича. Паттерн матчинг типов сумм - это больше к вкусовщине относится чем к концептуальным преимуществам. И даункаст в рантайме тот же самый в F# что и в C# - за исключением структур конечно

Friedrich
23.05.2017
13:22:40
В F# это тоже всего лишь ворнинг, если не путаю :(

Pawel
23.05.2017
13:22:59
но структуры в F# забагованы, ждём пока починят -на всякий случай добавлю

Friedrich
23.05.2017
13:23:22
Там какой-то конкретный юзкейс забагован.

Pavel
23.05.2017
13:23:35
DU+Pattern matching как раз таки киллер фича. Несколько строчек кода и готова сложная бизнес-логика с проверкой на этапе компиляции

Friedrich
23.05.2017
13:23:36
И то не страшно, всего лишь не компилируется :)

Pawel
23.05.2017
13:24:59

Evgeniy
23.05.2017
13:26:08
Решарпер не избавляет от необходимости держать кучу бойлерплейт кода для кодирования DU.

Pavel
23.05.2017
13:26:13
по-моему можно впечатлится даже локончиностью и чистотой F#-кода. Ну и не у каждого есть R#.

Anton
23.05.2017
13:26:21

Friedrich
23.05.2017
13:27:00

Pavel
23.05.2017
13:27:12
ну и R# тебе не запретит сокмпилировать не полный switch, а только поможет в его генерации

Friedrich
23.05.2017
13:27:22

Anton
23.05.2017
13:27:40

Vasily
23.05.2017
13:28:26
В F#, кстати, ногу себе отстрелить сложнее
Чем в C#

Pawel
23.05.2017
13:28:34

Friedrich
23.05.2017
13:29:10

Google

Friedrich
23.05.2017
13:29:21
Это плохо, но не страшно.

Pawel
23.05.2017
13:29:34

Anton
23.05.2017
13:30:28

Friedrich
23.05.2017
13:32:38
А я вот щас возьму да проверю, раз людям интересно.

Anton
23.05.2017
13:32:55

Evgeniy
23.05.2017
13:33:18
@fvnever Я про то, что DU все равно не очень удобно описывать.

Admin
ERROR: S client not available

Pavel
23.05.2017
13:33:52
Да, сделать можно, но это будет коряво и неудобно

Pawel
23.05.2017
13:36:06

Evgeniy
23.05.2017
13:36:21
@ruzzke_mir Можно ссылку на issue?

Alexander
23.05.2017
13:36:28

Friedrich
23.05.2017
13:37:08

Friedrich
23.05.2017
13:37:12

Anton
23.05.2017
13:37:34

Friedrich
23.05.2017
13:37:41
Кстати, сгенерить все ветки свитча он тоже не может для такого случая.
Для енумов генеряет.

Anton
23.05.2017
13:38:28
Сюда бы @controlflow он бы все рассказал. Но он ща в штатах кофий попивает и к людям уже не спустится на грешную землю.

Friedrich
23.05.2017
13:38:31
И проверки на полноту для enum работают.

Pawel
23.05.2017
13:38:40

Vasily
23.05.2017
13:38:42
В данном случае, мне кажется, еще упирается в сложность анализа

Google

Friedrich
23.05.2017
13:38:54

Vasily
23.05.2017
13:38:55
Решарпер должен построить AST
по всему солюшну
Имхо, на больших проектах будут большие тормоза
Да и сейчас он не самый быстрый
В теории, можно написать расширение для Рослина
Но тут вопрос
Какое поведение для наследников наследников?