
Akhmed
28.03.2017
07:21:32
собственно поэтому сделали warning-и. Можно на базе этих ворнингов сделать плагин автозамены let на use если кому нибудь это будет нужно ))

Roman
28.03.2017
07:39:42

Igor
28.03.2017
07:41:21

Google

Roman
28.03.2017
21:43:29
Ого, оказывается в f# 4.1 есть "рекурствные неймспейсы" название немного идиотское, но как я понял, позволяет внутри неймспейсы избавиться от специальных рекурсивных и ленивых подсказок компилятору например избавиться от and перед описанием взаимноссвязанных типов. т.е. раньше
namespace N
type MyType =
{
value: string
func: NotDefinedType -> string
}
and NotDefinedType = {...}
и теперь
namespace rec N
type MyType =
{
value: string
func: NotDefinedType -> string
}
type NotDefinedType = {...}

Vasily
28.03.2017
22:03:21
Это жопа на самом деле

Roman
28.03.2017
22:22:50

Friedrich
29.03.2017
04:14:44
Да ладно, чего тут страшного?

Evgeniy
29.03.2017
05:51:20
Самое главное, что в F#4.1 теперь модули и типы могут быть mutually referential.

Anton
29.03.2017
06:52:57
0_о я такое вообще впервые вижу =)

Vasily
29.03.2017
06:57:39
Да ладно, чего тут страшного?
Ну как чего, нарушается принцип чтения сверху вниз, если я правильно понял,а это усложнит чтение кода и понимание, что в нём написано

Igor
29.03.2017
07:03:12

Vasily
29.03.2017
07:05:03
В f# от базового к продвинутому,аналогично с расположением файлов в проекте.Поэтому,взяв чужой код,я в нём быстро сориентируюсь.
Хочу кор методы глянуть-смотрю в первый файл в начало и т.д.

Igor
29.03.2017
07:05:52

Vasily
29.03.2017
07:06:41
Это нормально,как минимум заставляет структурировать код
Поэтому, например,в f# проще понять, что человек имел в виду,смотря его код.Также это облегчает код ревью сильно,по идее

Google

Vasily
29.03.2017
07:10:01
В c# у меня периодически глаза вытекают от конструкций а-ля паршиал класс в паршиал классе в паршиал классе.И так в нескольких файлах

Igor
29.03.2017
07:13:15
Кстати, дописал бота на F#+core - https://github.com/y2k/SlackBot/
Есть какие-нибудь предложения что там можно отрефакторить?

Vasily
29.03.2017
07:16:50
Там sql injection возможна на первый взгляд

Igor
29.03.2017
07:19:39

Vasily
29.03.2017
07:20:06
SQLParam
Если есть в коре,ну и склейкой строк не баловаться
Flatmap имеется в виду select many?
В f# встроенное есть, аналогично с List.where

Igor
29.03.2017
07:25:14

Vasily
29.03.2017
07:25:39
Ну там внутри этого вызова
Ща с телефона просто
Еще там моя любимая мякотка с List.contains
Но это скорее по части быстродействия
Я в таких случаях хэшсет использую

Igor
29.03.2017
07:32:02
Меня больше всего беспокоит что я постоянно создаю (fun x -> ...) при работе с |> - нельзя где нибудь в коде это упростить?

Evgeniy
29.03.2017
07:35:35
Завести вместо кучи анонимных функций обычные с хорошими именами.
Например, суть происходящего в Program.fs от меня ускользает за кучей отображений и синтаксического шума от (fun x -> ...).

Vasily
29.03.2017
07:38:05
Тоже хотел предложить
Еще я не понял,зачем такое раннее приведение к Observable

Google

Igor
29.03.2017
07:54:06

Vasily
29.03.2017
07:56:15
Observable.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(5.))
|> o.map (fun _ -> bot.getNewBotMessages token)
|> flatMap (fun x -> x.ToObservable())
Последнее

Igor
29.03.2017
07:57:18
Последнее
Ну у меня есть коллекция элементов, а я хочу обработать их паралельно в рамках реактивного-стрима

Vasily
29.03.2017
07:57:46
Async тогда
Хотя хз

Igor
29.03.2017
07:58:22
Хотя хз
Ну вот я тоже хз, меньше кода точно не станет

Vasily
29.03.2017
07:58:33
Возможно,что тут я погорячился
Не помню, было или нет: https://eiriktsarpalis.wordpress.com/2017/03/20/why-oo-matters-in-f/

Evgeniy
29.03.2017
09:57:55
Было. Но можно и еще разок перечитать. :)
Хорошая статья.

Vasily
29.03.2017
09:58:06
Она разумная
И как раз про то, как f# в продакшн встраивать по-нормальному

Roman
29.03.2017
10:00:38

Evgeniy
29.03.2017
10:04:14
https://eiriktsarpalis.wordpress.com/2017/02/19/youre-better-off-using-exceptions/
Вот эта статья тоже неплохая.

Vasily
29.03.2017
10:08:27
Ну про эксепшны-то понятно
Поссыл в том, что в доменной модели должны все стейты описываться

Roman
29.03.2017
10:08:54
Угу

Vasily
29.03.2017
10:09:25
проблема в том, что при интеропе такую модель описать довольно сложно

Google

Roman
29.03.2017
10:10:50
и естественно называть это как-нибудь Result.ofExternal

Vasily
29.03.2017
10:11:37

Evgeniy
29.03.2017
10:25:27
Ну, мне не особо понятно.
Даже не так.
Не особо понятно, как идиоматично писать на F#. :)

Roman
29.03.2017
12:25:05

Дед Пегас
29.03.2017
12:26:12
Будто плавать учишься)

Evgeniy
29.03.2017
15:31:52
Так далеко можно заплыть. :) На территории неконтролируемых point-free, кастомных операторов, SRTP...
Ну, или с другой стороны можно писать все как в C#.
Крайности.

Nikolay
29.03.2017
17:08:30
Пишу бота для телеги на F#, интересует как лучше сделать для него модули? В C# бы например сделал интерфейс, либо абстрактный класс и от него бы наследовал свои модули, собственно интересует как лучше в F# подобное намутить
Модель это обработчик сообщений/обновлений
Ну и вообще в целом интересует как это лучше сделать

Igor
29.03.2017
17:09:20

Nikolay
29.03.2017
17:10:13

Arseniy
29.03.2017
17:10:28
Я повторюсь, что делал бы через комбинаторы. Вот пример на пальцах https://github.com/tamizhvendan/MiniSuave/blob/master/MiniSuave.fsx#L21

Igor
29.03.2017
17:11:51

Alexander
29.03.2017
17:12:32

Roman
29.03.2017
17:13:15

Google

Roman
29.03.2017
17:13:46
если ты хоть hello world написал на F#, то там сразу понятно что ф-ции объекдиняются в модули.
Перефразируй плз вопрос @Dolfik

Arseniy
29.03.2017
17:14:47
Не слишком жестоко для новичка?
да не, если почитать книгу, то всё понятно. по куску кода может и не очень, но идея комбинаторов вроде не сильно сложна. могу книгу этого индуса сбросить, если меня не заберут потом как пирата)

Roman
29.03.2017
17:15:08
Ты же для ознакомления скинешь

Arseniy
29.03.2017
17:16:13
@Dolfik зацени главу про minisuave, это подходит под твои модули или ты там реальные плугины делать собрался?
>Web Server As A Function
и тд и тп.
по сути Chat Bot as a Function делается простой заменой моделек

Roman
29.03.2017
17:17:37

Nikolay
29.03.2017
17:20:41
Типа такого
Очень грубо, но смысл думаю понятен

Roman
29.03.2017
17:24:31

Arseniy
29.03.2017
17:26:34
ну у него есть обработчики, они обрабатывают все сообщения.
грубо говоря, вместо комбинатора Choose используется Broadcast или как это правильно назвать

Roman
29.03.2017
17:27:17

Nikolay
29.03.2017
17:28:58
Но мне не принципиален такой подход, если есть варианты организации кода лучше, я только за

Roman
29.03.2017
17:35:43

Igor
29.03.2017
17:37:39