@Fsharp_chat

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

Roman
28.03.2017
07:39:42
А не какого-нибудь компьютеншен-билдера, который закроет все IDisposable которые неявно объявлены внутри него?
Есть ф-ция using в ее колбэке можно использовать idisposable. Dispose вызовется когда завершится ф-ция.

Igor
28.03.2017
07:41:21
Есть ф-ция using в ее колбэке можно использовать idisposable. Dispose вызовется когда завершится ф-ция.
да, уже прочитал доки (хотелось бы конечно без явного перечисления disposable)

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
Ну как чего, нарушается принцип чтения сверху вниз, если я правильно понял,а это усложнит чтение кода и понимание, что в нём написано
В смысл от деталей-к-общему? Всегда думал что в F# (как и в C/C++) надо читать снизу-вверх (хотя это касается скорее методов чем типов).

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

Хочу кор методы глянуть-смотрю в первый файл в начало и т.д.

Vasily
29.03.2017
07:06:41
Это нормально,как минимум заставляет структурировать код

Поэтому, например,в f# проще понять, что человек имел в виду,смотря его код.Также это облегчает код ревью сильно,по идее

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

Igor
29.03.2017
07:13:15
В c# у меня периодически глаза вытекают от конструкций а-ля паршиал класс в паршиал классе в паршиал классе.И так в нескольких файлах
За много лет писания на C# никогда не приходилось саму его создавать (да и обычно это юзается костыль для кодогенеторов).

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

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

Igor
29.03.2017
07:19:39
Там sql injection возможна на первый взгляд
да тоже об этом думал, надо будет погуглить как экранировать

Vasily
29.03.2017
07:20:06
SQLParam

Если есть в коре,ну и склейкой строк не баловаться

Flatmap имеется в виду select many?

В f# встроенное есть, аналогично с List.where

Igor
29.03.2017
07:25:14
Flatmap имеется в виду select many?
Ты про Observable (там точно нет)?

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
Еще я не понял,зачем такое раннее приведение к Observable
можно ссылку на строчку, а то я не понимаю

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
проблема в том, что при интеропе такую модель описать довольно сложно
В трайвиз заворачивает так же как if o = null при опционально типе

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

Evgeniy
29.03.2017
10:25:27
Ну, мне не особо понятно.

Даже не так.

Не особо понятно, как идиоматично писать на F#. :)

Roman
29.03.2017
12:25:05
Не особо понятно, как идиоматично писать на F#. :)
Ты пиши, язык тебя сам подтолкнет.

Дед Пегас
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# подобное намутить

Модель это обработчик сообщений/обновлений

Ну и вообще в целом интересует как это лучше сделать

Nikolay
29.03.2017
17:10:13
? - вот как надо F# продвигать в массы
Просто хочется пощупать функциональщины :)

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

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

Перефразируй плз вопрос @Dolfik

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

Arseniy
29.03.2017
17:16:13
@Dolfik зацени главу про minisuave, это подходит под твои модули или ты там реальные плугины делать собрался?

>Web Server As A Function и тд и тп. по сути Chat Bot as a Function делается простой заменой моделек

Nikolay
29.03.2017
17:20:41
Перефразируй плз вопрос @Dolfik
https://gist.github.com/Dolfik1/cde1d042cfe3828ccdcf1921b919f032

Типа такого

Очень грубо, но смысл думаю понятен

Roman
29.03.2017
17:24:31
Очень грубо, но смысл думаю понятен
т.е. у тебя каждйы модуль реагирует на свое сообщение?

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

Roman
29.03.2017
17:27:17
ну у него есть обработчики, они обрабатывают все сообщения. грубо говоря, вместо комбинатора Choose используется Broadcast или как это правильно назвать
понятно. Я как раз и хочу понять как @Dolfik делит на "модули" если это один подуль - одно сообщение, то тут явно комбинаторный подход есть.

Nikolay
29.03.2017
17:28:58
понятно. Я как раз и хочу понять как @Dolfik делит на "модули" если это один подуль - одно сообщение, то тут явно комбинаторный подход есть.
Ну модуль отвечает за какой-то функционал определённый, и может одновременно обрабатывать несколько разных команд

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

Roman
29.03.2017
17:35:43
Ну модуль отвечает за какой-то функционал определённый, и может одновременно обрабатывать несколько разных команд
У тебя явно заметна структура обработчик сообщения одна ф-ция. И тебе по сути нужен роутер. Можно идти двумя путями сделать по аналогии с Requset - Responce как в suave по принципу вебсервиса. Или превращать команду в осмысленный объект распарсив ее(по приницпу интерпретатора)

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