@Fsharp_chat

Страница 177 из 772
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
Я правильно понимаю, что мы сейчас заходим в область ленивых/асинхронных вычислений?
уж и не знаю как ещё сказать по другому. По моему предельно ясно изложил. Вот пример https://gist.github.com/fpawel/6d7d99f3b4830a5161527e9cbe2e4faf Если не задать __DEBUG__ , то вывода не будет

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
Ну я бы на сайд эффектах не стал писать
в таком случае ты пишешь только пруверы теорем на F* или Idris. Снимаю шляпу)

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
@Dolfik Хочешь поправить FSharp.Data, чтобы он поддерживал Mono 5?
Не, я смотрел что там для кор требуется

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
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
Вместо if (not << isNull) x пишешь if notNull x.
не-а) нормальный код - это if x <> null))))

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 - ну офигеть как проще стало )

@ruzzke_mir В производительности. https://stackoverflow.com/questions/6817852/handling-null-values-in-f/6818329#6818329
Не вижу каким образом If you have a type that has been declared in C# or a .NET library in general (not in F#) then null is a proper value of that type and you can easily compare the value against null as posted by kvb. а для других значений, которые из F#, операция сравнения с null как минимум странная

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


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