
Vasily
29.05.2017
13:45:51
Ну если зависимость не кольцевая, все вроде и так ок должно быть

k0balt
29.05.2017
14:05:10
ну вообще полезно бывает вычислить на старте (например), а когда оно понадобится уже не ждать

Vasily
29.05.2017
14:21:16
Насколько я помню, на том же старте можно сделать через do

Pawel
29.05.2017
15:05:30
Ну если зависимость не кольцевая, все вроде и так ок должно быть
Ещё раз. ок - это когда ссылки вместе с объектами по ссылкам вычисляются в порядке их объявления (Go). В F# объекты, на которые ссылаются привязки let уровня модуля, вычисляются по требованию. И это не то что не ок, это ужос ужос, чревато NullReferenceException-ами и изрядным количеством обезьяньего кодинга

Google

Vasily
29.05.2017
15:06:45
Ну объявляются же они в порядке вычисления, а не произвольно
Т.е. на текущий момент я не могу в f# использовать необъявленное значение

Pawel
29.05.2017
15:13:33
так в том то и дело что в F# объявлено != инициализировано, объявление вовсе не означает, что правая часть привязки будет вычислена к моменту её использования

Vasily
29.05.2017
15:14:15
Я правильно понимаю, что мы сейчас заходим в область ленивых/асинхронных вычислений?

Nikolay
29.05.2017
15:40:54
А нет такой штуки, которая конвертирует C# в F#?

Evgeniy
29.05.2017
16:10:20
Нету.

Pawel
29.05.2017
16:14:37

Vasily
29.05.2017
16:18:22
Ох уж эта мемоизация...

Pawel
29.05.2017
16:19:55
мемоизация здесь совершенно не при чём

Vasily
29.05.2017
16:20:57
А ты поставь () в объявлениях x1 и x2
И в вызовах соответственнр

Pawel
29.05.2017
16:25:53
моя цель в данном случае заключается не в том, чтобы получить вывод в консоль, а в том, чтобы продемонстрировать баг

Vasily
29.05.2017
16:28:55
Ну надо тогда не на unit type

Google

Pawel
29.05.2017
16:31:31
да там по фигу какой тип, совершенно фиолетово

Vasily
29.05.2017
16:33:13
Ну я бы все же попробовал с интом,например, чтобы исключить сайд эффекты

Friedrich
29.05.2017
16:38:29

Vasily
29.05.2017
16:51:36
Ну я бы на сайд эффектах не стал писать

Friedrich
29.05.2017
16:53:16
Ну я бы на сайд эффектах не стал писать
Видишь, тут нету такого выбора — писать или не писать. Нужно человеку инициализировать сторонние библиотеки, и он эту задачу будет решать, хочет или не хочет.

Nikolay
29.05.2017
17:43:48
Привет :)

Evgeniy
29.05.2017
17:56:22
@ZloyTatarin Пожалуйте.

Анвар
29.05.2017
17:56:54
Здравствуйте

Klei
29.05.2017
18:25:28
А у вас есть/будет/планируется курс по такого рода вещам?
Вообще уже сейчас есть курс на интуите. Я давно пробовал начинать его, но "повесился" ближе к середине как раз на тестах по таким штукам.
Хотя может там и не так хардкорно как мне казалось, ибо это была моя первая серьезная попытка влезть в F#.

Pawel
29.05.2017
18:40:26

Nikolay
29.05.2017
18:43:35
В чём разница между проектами FSharp.Data.DesignTime.fsproj и FSharp.Data.fsproj не знаете?

Evgeniy
29.05.2017
19:10:44
@Dolfik https://github.com/fsharp/FSharp.Data/blob/master/CONTRIBUTING.md#projects-and-multi-targeting

Nikolay
29.05.2017
19:11:31
Ясно, спасибо

Evgeniy
29.05.2017
19:15:01
@Dolfik Хочешь поправить FSharp.Data, чтобы он поддерживал Mono 5?

Nikolay
29.05.2017
19:15:24

Evgeniy
29.05.2017
19:16:38
@Dolfik Но зачем?
Ну, в смысле, erased providers должны работать под .Net Standard 2.0
А generative providers не будут работать, пока не завезут необходимые API.

Nikolay
29.05.2017
19:17:56
Ну тогда забить на Funogram и пилить после .Net Standard 2.0

Evgeniy
29.05.2017
19:18:29
@Dolfik А что ты хотел из FSharp.Data использовать?

Google

Nikolay
29.05.2017
19:18:40

Evgeniy
29.05.2017
19:18:47
JsonProvider?

Nikolay
29.05.2017
19:19:12
Да
А erased providers это что такое?

Evgeniy
29.05.2017
19:20:06
По сути это хитрый трюк компилятора. Erased type provider "генерируют" типы, которые стираются после компиляции.
А generative providers генерируют настоящий IL код.
В сборку, сгенерированный код потом можно использовать в даже C#.

Nikolay
29.05.2017
19:20:45
И чем generative лучше erased? Производительность?

Evgeniy
29.05.2017
19:24:42
Generative дает настоящие типы, которые могут хранить состояние, лежат в сборке, их можно использовать из остального дотнета.

Летучая
29.05.2017
20:19:02

Vasily
29.05.2017
20:20:05

Artemy
29.05.2017
20:21:32
С чёрненьким мне почему-то больше нравится.
Контрастнее что ли

Vasily
29.05.2017
20:22:35
Там реально недетерменированное поведение-зависит от того, когда консоль инициализируется.А второй раз не выполняется как раз из-за мемоизации функций без параметров

Artemy
29.05.2017
20:24:24

Roman
29.05.2017
20:29:24
Как наклейка лучше пойдет светлый вариант. Хотя так темный и выглядит приятнее

Pawel
29.05.2017
20:42:52
Я понял, что меня смущает-пример вырожденный,и почему не работает, тоже более-менее понятно
никакой мемоизации там нет
никаких функций без параметров там нет
пример отражает практику, которая используется чуть более чем во всех продовых проектах - банальная инициалзация повторно используемого объекта в модуле
поведение абсолютно детерминированное - и глупое. Связано с тем, что авторы языка хотели исключить неиспользуемые вычисления. Но вместо того, чтобы проверить при компиляции востребованность _всех_ объявлений в модуле (опять таки как в Go), сделали как в Ocaml.

Nikolay
29.05.2017
21:09:15
Обе хороши

Летучая
29.05.2017
21:09:50
Спасибо за мнения, ребята! Пошаманю с векторами, скину исходники, как будет готово. Потом можно будет на мероприятиях раздавать!

Nikolay
29.05.2017
21:10:13
Ноут только для этого купить осталось ?

Google

Pawel
29.05.2017
21:11:20
немножко оффтопа про дядюшку боба. Тут вроде кто-то удивлялся чего это я его не уважаю www.youtube.com/watch?v=e-p35Z3Z7DI - типичная проповедь ООП))

Evgeniy
29.05.2017
21:34:27
Жалко, что в CLI нельзя делать generic-полей.
Я все еще не понимаю, причем здесь generic-поля.
let notNull = not << isNull не работает, потому что компилятор не может генерализовать значение. Если, например, явно прописать все generic параметры, то данная функция скомпилируется в internal класс и статический generic-метод, возвращающий инстанс этого класса.

Roman
29.05.2017
21:55:17
Белые границы
Хотя оба
Мне кажется нужна и белая и чёрная

Летучая
29.05.2017
22:00:50
Там в svg VS code-ом можно цвет фона махнуть при желании )
SVG вообще офигенский формат.

Evgeniy
30.05.2017
04:43:02
@susloparov Привет!
@Worldbeater Спасибо!

Vlad
30.05.2017
05:22:05
Черный покрасивше

Алексей
30.05.2017
05:23:04
в зависимости от крышки ноута на самом деле
На светлую с черной рамкой, на свой (у меня темный люминий) с белой каймой

Friedrich
30.05.2017
06:37:54
Я все еще не понимаю, причем здесь generic-поля.
let notNull = not << isNull не работает, потому что компилятор не может генерализовать значение. Если, например, явно прописать все generic параметры, то данная функция скомпилируется в internal класс и статический generic-метод, возвращающий инстанс этого класса.
Это определение не работает потому, что компилятор *не хочет* генерализовать значение. Даже если прописать генерик-параметры (let notNull<_> = ...) — всё равно не заработает, потому что генерик-полей и переменных в CLI не бывает. (Хотя, может, оно и к лучшему — они могут вызывать путаницу.)

Evgeniy
30.05.2017
06:44:57
@fvnever Я не могу согласиться.
@fvnever
let notNull<'a when 'a : null> : 'a -> bool =
not << isNull

Friedrich
30.05.2017
06:46:57
Хм.

Evgeniy
30.05.2017
06:47:05
Посмотри, заодно, во что это компилируется.

Friedrich
30.05.2017
06:48:08
А чо оно тогда с <_> не хочет?

Evgeniy
30.05.2017
06:49:14
@fvnever Да, компилятор действительно не хочет генерализовывать значение, потому что в некоторых случаях это может привести к неправильному поведению.
@fvnever Рекомендую к вечернему прочтению.
https://blogs.msdn.microsoft.com/mulambda/2010/05/01/finer-points-of-f-value-restriction/

Google

Pawel
30.05.2017
06:51:31
а зачем нужна такая функция notNull ? код с ней короче не будет, зато будет более запутанным

Friedrich
30.05.2017
06:51:45
Как это не будет?
Вместо if (not << isNull) x пишешь if notNull x.
Намного короче, как по мне.
И читабельнее — не путаешься во всех вот этих >> << |<|

Evgeniy
30.05.2017
06:53:17
tl;dr
So when it is safe to automatically generalize? It is hard to argue precisely, but one simple answer suggests itself: generalization is safe if the expression on right-hand side of “let” both:
- is side-effect free (also known as pure)
- produces an immutable object
И там еще немного про аннотации [<GeneralizableValue>] и [<RequiresExplicitTypeArguments>].
Хорошая статья.

Pawel
30.05.2017
06:54:24

Evgeniy
30.05.2017
06:54:47
@ruzzke_mir Это плохой код.
http://latkin.org/blog/2015/05/18/null-checking-considerations-in-f-its-harder-than-you-think/

Pawel
30.05.2017
07:06:36
Ну смотри... x - это nullable, default(a) - статический null. Код GenericEqualityObj аналогичен Object.ReferenceEquals. В чём проблема то?

Evgeniy
30.05.2017
07:09:13
@ruzzke_mir В производительности.
https://stackoverflow.com/questions/6817852/handling-null-values-in-f/6818329#6818329
В F#4.0 добавили isNull. И это самый правильный сейчас способ сравнивать с null.

Pawel
30.05.2017
07:12:24
obj.ReferenceEquals (x,null) vs. isNull x - ну офигеть как проще стало )

Летучая
30.05.2017
07:16:14