Fill
21.01.2018
10:36:34
типа в качестве результата возвращать error?
Artemy
21.01.2018
10:36:52
Error — это одна из веток Result
type Result<'a, 'b> = | Ok of 'a | Error of 'b
Fill
21.01.2018
10:37:25
ну понятно. Есть метод, который читает из файла, возвращает или строку с данными, или error
Google
Fill
21.01.2018
10:37:34
но не выбрасывает исключений
Artemy
21.01.2018
10:37:47
Как-то так, да
Fill
21.01.2018
10:37:50
да, looks good
спасибо
Mikhail
21.01.2018
10:38:11
Даже в Haskell, насколько я знаю, функции для работы с файлами выбрасывают исключения
Artemy
21.01.2018
10:38:13
Это же как раз и есть "Железнодорожно-ориентированное программирование" ?
Григорий
21.01.2018
10:38:23
https://github.com/gusty/FSharpPlus
Artemy
21.01.2018
10:39:12
Всё-таки забавный перевод (хотя непонятно, как это красиво перевести; разве что "рельсо-ориентированное" кто-то предлагал; но, по-моему, оно недалеко от 1-го варианта ушло)
Pavel
21.01.2018
10:41:50
https://fsharpforfunandprofit.com/posts/recipe-part2/
Sergey
21.01.2018
10:42:35
Я правильно понимаю, что использование исключений - не функциональный путь?
на самом деле в ответе много если, и спорных моментов https://eiriktsarpalis.wordpress.com/2017/02/19/youre-better-off-using-exceptions/
и даже если почитать https://pragprog.com/book/swdddf/domain-modeling-made-functional от автора Chessie http://fsprojects.github.io/Chessie/ и Railway-oriented programming
то он пишет о том что в своем коде и бизнес логике не стоит кидать ексепшены (т.е. если вы знаете что может что-то пойти не так и вам надо это обрабатывать - то юзать надо Result) но системные ексепшены и и те случае которые вы по бизнес логике не обрабатывает в коде - не нужно ложить и заварачивать в Result - это очень даже ок если такая ситуация крашнет приложение. Ексепшены это норма для .NET и нету нужны лечить их все в каждом приложении
Google
Sergey
21.01.2018
10:44:14
и всем у кого есть возможность почитать https://pragprog.com/book/swdddf/domain-modeling-made-functional - рекомендую, оно как-то ставит все на свои места в этим ROP
Fill
21.01.2018
10:44:30
и там короче обратно
из result в exception
Artemy
21.01.2018
10:45:07
Там ещё, вроде, кто-то отмечал, что перехват исключения работает быстрее
Fill
21.01.2018
10:45:42
ну, кейс с исключением ведь не тот, где ты считаешь производительность
Sergey
21.01.2018
10:45:50
Григорий
21.01.2018
10:46:19
Sergey
21.01.2018
10:46:47
а можно ссылочку?)
да, была в моем длинном сообщении выще https://eiriktsarpalis.wordpress.com/2017/02/19/youre-better-off-using-exceptions/
и еще есть не плохие советы по тому как делать public API https://pblasucci.wordpress.com/2016/12/30/betterapi/
Fill
21.01.2018
10:48:41
всем спасибо за ответы) Будет терь, что почитать на вечер
Artemy
21.01.2018
10:54:10
Хотя они, когда я как-то смотрел сам, в C#-коде вполне нормально выглядят (по крайней мере Option)
Sergey
21.01.2018
10:55:05
Artemy
21.01.2018
10:55:50
Sergey
21.01.2018
10:56:21
на сколько я видел C# API стараются делать без них, иначе код становится в C# cтрашноват для тех кто не знаком с F#
Artemy
21.01.2018
10:56:58
А, ну разве чтобы не пугать незнакомых с самим понятием Option-типа, да
В общем, спасибо за ссылочки на статьи
Sergey
21.01.2018
11:06:32
А, ну разве чтобы не пугать незнакомых с самим понятием Option-типа, да
FSharp.Core.Option для C# превращается в Microsoft.FSharp.Core.FSharpOption что уже не так красиво, + там нету |> и чтобы с ним что-то сделать надо написать что-то длинное, быстро начинаешь придумывать свои extension методы чтобы удобнее пиcать и код становится еще менее интуитивным
для C# всетаки роднее Nullable ну и для тех кто скучает по прекрасному есть https://github.com/louthy/language-ext
Google
Artemy
21.01.2018
11:08:57
О, спасибо за ссылочку
Даже Parsec есть
Sergey
21.01.2018
11:11:35
Даже Parsec есть
есть еще вот такая штука https://github.com/sprache/Sprache даже встречал ее в реальных проектах, хотя мне сложнее ее читать чем FParsec
Fill
21.01.2018
16:01:57
Где можно почитать о code style на F#?
Григорий
21.01.2018
16:04:52
Fill
21.01.2018
16:05:39
спс
Bonart
21.01.2018
22:15:02
Sergey
22.01.2018
05:09:58
Evgeniy
22.01.2018
06:33:35
Привет.
Most
22.01.2018
06:43:43
Привет, @gsomix)
Я уходил месяца 4 назад, теперь вернулся)
А кто-нибудь тут mbrace в работе пробовал?
А еще интереснее, mbrace vs spark)
Evgeniy
22.01.2018
07:05:40
https://twitter.com/eiriktsarpalis/status/955135906872209409
Небольшая группа по совместному чтению TaPL и SF. Сейчас в основном обсуждают SF и interactive theorem proving.
https://t.me/joinchat/A8_s30LVQrNmQWBlBlJUKw
Roman
22.01.2018
11:18:01
Господа, такая проблема:
Есть проект с либой и проект-консоль, который его дергает.
В первом проекте есть несколько файлов, если в одном из них объявляю типы, консоль их не видит. Стоит перенести в следующий файл и объявить их точно так же - все в порядке.
Объявляю их в одном неймспейсе с одинаковой видимостью. Есть идеи?
Возможно, это баг в VS Code или Ionide, пушто CLI интерфейс не показывает ошибок
Григорий
22.01.2018
11:19:07
а либа на f#?
Roman
22.01.2018
11:19:49
Да, все на фшарпе. И проблемы только в консольном проекте, внутри либы все в порядке
Григорий
22.01.2018
11:21:11
а типы находятся в модулях или нет?
Roman
22.01.2018
11:21:29
нет, отдельно в обоих случаях
Google
Григорий
22.01.2018
11:22:12
то есть типы находятся в namespace либы?
Roman
22.01.2018
11:22:18
ага
Григорий
22.01.2018
11:24:17
а проект собирается в обоих случаях без ошибок или что-то пишет?
Roman
22.01.2018
11:27:09
Если через CLI, то обоих случаях все ок. Через ионид - ругается, что типы не определены в одном случае
Григорий
22.01.2018
11:29:14
возможно порядок файлов нарушен, вот он и не может найти тип
Roman
22.01.2018
11:33:14
нет, с ним все ок
Походу, это был косяк редактора. Закрытие табы помогло)
При том, что рестарт VS Code не помогал)
Admin
Roman
22.01.2018
11:44:58
Roman
22.01.2018
11:54:11
Evgeniy
22.01.2018
16:57:05
https://twitter.com/dustinmoris/status/955479681398173697
Григорий
22.01.2018
18:12:41
в F# есть синтаксис для работы с методами и свойствами объекта наподобие `with` из Delphi?)
Roman
22.01.2018
18:16:57
Григорий
22.01.2018
18:18:28
http://www.delphisources.ru/pages/faq/faq_delphi_basics/With.php.html
Roman
22.01.2018
18:19:28
Григорий
22.01.2018
18:28:33
прочитал внимательнее то, что сам скинул, это не то. Скажем, чтобы не писать вот такое:
type A () =
member this.Test() = ..
member this.Test2() = ..
...
let a = new A()
a.Test()
a.Test2()Хотелось бы, что-то вроде:
with a do
Test()
Test2()
Klei
22.01.2018
18:33:54
В F# нечасто такой код встречается.
Григорий
22.01.2018
18:34:38
согласен
но если используешь dotNet api, то возникает такая необходимость =)
Google
Klei
22.01.2018
18:37:13
Кстати, удобная фича, если бы тавкое завезли в C# можно было бы не строить fluent-api для изменяемых объектов.
Ivan
22.01.2018
18:45:41
Полезнее был бы Kotlin синтаксис для буилдеров, это бы реализовалось само.
Про FSPickler новость действительно важная. Один из быстрейших бинарных сериализаторов. Можно преписать Orleans на FSharp с идеоматическими возможностями
Klei
22.01.2018
19:06:42
Ivan
22.01.2018
19:36:05
У FSharp билдеров сложно делать вложенные. В том то и дело, что похоже, но по другому. В FSharp - билдер - спец класс. Содной стороны это круче, с другой бойлерплейт. И если Kotlin билдеры - это просто синтаксический сахар, наши - это монадные автоматы при компиляции. Так что палка о двух концах. АНо в котексте я говорил о C#
Было бы удобно, если бы описание функции:
let f a b g = g a b
Позволяло записать ее вызов как
f 1 2
a + b
Григорий
22.01.2018
19:44:39
типо g вычисляется как a + b?
Ivan
22.01.2018
19:46:09
Или:
let until cond body = while cond() |> not do body()
Как:
let mut s = 1
until s>5
s <- s + 1
Григорий
22.01.2018
19:47:50
попахивает макросами из си =)
Ivan
22.01.2018
19:48:59
Даже отдаленно - нет ? Попахивает сильно Nemerle ?
Григорий
22.01.2018
19:56:33
метапрограммирование с изменением состояния выглядит опасненько - накрутят новых конструкций и потом разгребай это при малейших изменениях
Pavel
22.01.2018
19:57:04
Котлин билдеры это совсем не для f#, да и не для фп в целом
Вот в c# бы пригодилось
Ivan
22.01.2018
19:58:11
Я пример приводил. Неудачный. Суть в м том, что у Котлина есть оч слабая модельмета расширений, абсолютно типобезопасная и простая. В немерле мета крайне могуч, но сложен.
И когда я говорил о Котлиновской модели, имел в виду C#
Pavel
22.01.2018
19:59:41
Да, для c# очень хочется
Roman
22.01.2018
20:00:48
Ivan
22.01.2018
20:00:52
В F# все сложнее из за отсутсвия скобок. Компилятору не разобрать конца