@Fsharp_chat

Страница 764 из 772
Grigoriy
21.10.2018
12:40:13
Чего там копипастить? Маппер один раз на результат натравить?

Ayrat
21.10.2018
12:41:36
а fn >> mapper не сработает?
Нет. Пример (a -> b -> c) >> f f должно вида (b -> c) -> d Короче композиция только одну арность снимает

И после такой композиции получим дичь a -> ((b -> c) -> d)

Google
Ayrat
21.10.2018
12:44:16
А не. Будет a -> d ) но короче композиция не поможет

Vasily
21.10.2018
12:44:45
Ну я же говорю- надо билдер

Andrew
21.10.2018
12:45:56
Чего там копипастить? Маппер один раз на результат натравить?
let sample1 a b = (a + a).ToString() let sample2 a b c = sprintf "%s, %s, %s" a b c let mapper s = sprintf "Result: %s" s let mSample1 = fun a b -> sample1 a b |> mapper let mSample2 = fun a b c -> sample2 a b c |> mapper mSample1 1 2 |> Dump mSample2 "a" "b" "c" |> Dump --- Result: 2 Result: a, b, c Понятно, что копипастить не много. Но моего внутреннего перфекциониста раздражает, что надо писать так: fun a b c d e f g h -> fn a b c d e f g h |> mapper вместо fn >>> mapper

Grigoriy
21.10.2018
12:48:54
Я не про синтетику. Я про реальные задачи

Grigoriy
21.10.2018
12:49:11
Во-во

Затуплить

И свести к одному параметру

Бинго :)

Ayrat
21.10.2018
12:49:59
Затуплить
Да. Или зарекордить или замассивить

Andrew
21.10.2018
12:50:19
ммм. идею понял. да, тоже выход. спасибо

Grigoriy
21.10.2018
12:51:22
Василий, извини - билдер в другой раз :)

Google
Friedrich
21.10.2018
12:55:10
В общем, у меня не получилось на SRTP это сделать.

Vasily
21.10.2018
12:55:11
Friedrich
21.10.2018
12:56:01
Я пришёл вот к такому вот: type FunResult = FunResult with static member inline wrap (_ : FunResult, f : 'a -> 'b) = 1 static member inline wrap (_ : FunResult, f : 'b) = 2 И уже это SRTP-движком не хавается, потому что он не может понять, какую из перегрузок использовать для функции (ей же обе перегрузки подходят).

Если б можно было вторую перегрузку разрешить только для нефункциональных типов, то можно было бы чото сообразить.

Ayrat
21.10.2018
12:57:52
Если б можно было вторую перегрузку разрешить только для нефункциональных типов, то можно было бы чото сообразить.
Это даже хаскель из коробки не умеет. Даже кайнды типов стрелки не абстрагируют вроде

Grigoriy
21.10.2018
13:15:19
ммм. идею понял. да, тоже выход. спасибо
https://sidburn.github.io/blog/2017/03/13/variable-arguments

Artemy
21.10.2018
15:31:57
Один из подходов работы с произвольным числом параметров тут используется: https://github.com/dotnet-websharper/forms/blob/master/docs/Introduction.md P.S.: В доке старое API, но идея та же

Это как в билдере, только без синтаксиса CЕ, вроде

Roman
21.10.2018
16:02:26
Привет!

Влад
21.10.2018
16:08:33
добрый вечер)

Roman
21.10.2018
21:07:04
https://sergeytihon.com/2018/10/20/f-weekly-42-2018-zander-fantomas-and-extending-f/

Klei
22.10.2018
07:57:23
Есть способ гарантировать "вычисление" содержимого модуля сразу после запуска приложения? Надо чтобы сервис при выполнении определенного условия падал сразу, а не через 20 минут в конце пайпа. В перспективе модулей будет много, так что вариант дернуть необходимый модуль где-нить в районе main не катит.

Bonart
22.10.2018
08:08:15
А кто мешает в начале пайпа воткнуть проверку того самого условия?

Klei
22.10.2018
08:13:15
А кто мешает в начале пайпа воткнуть проверку того самого условия?
Хотелось бы локализовать проблему в самом модуле. Чтобы навесил атрибут или еще что-нибудь, и больше не заботился об этом.

Просто закостылить сложности нет.

Bonart
22.10.2018
08:18:25
Bonart
22.10.2018
08:20:32
Некостыльное решение проблемы инициализации сводится к разрешению зависимостей. Т.е. если модуль А зависит от модуля Б, а тот от модуля В, то инициализация будет в порядке В-Б-А

Ayrat
22.10.2018
08:20:53
Не понял.
ну сделай пайп не так action -> action -> action -> predicate а вот так predicate -> action -> action -> action

Klei
22.10.2018
08:31:41
ну сделай пайп не так action -> action -> action -> predicate а вот так predicate -> action -> action -> action
Вопрос был про принудительное выполнение. Проблема пайпа решается кучей способов, которые мне правда не нравятся.

Google
Ayrat
22.10.2018
08:32:01
всё что написано в модулях - вычислится в порядке загрузки модулей

module A = let a = printfn "1" 0 при загрузке модуля будет сайд эффект!

Ilya
22.10.2018
08:37:03
Ну там же это наверняка в статическом конструкторе запускается, а он вызывается после первого обращения к классу. Т.е. чтобы это вычислилось, надо ручками модуль потрогать.

Klei
22.10.2018
08:41:04
В кор они вроде бы все dll?

Friedrich
22.10.2018
08:41:30
Вообще, самый верный способ — это, конечно, сделать у него явную функцию-инициализатор, которую явно вызывать перед началом работы. Мб вместо модуля сделать обычный инстансный класс/рекорд.

В кор они вроде бы все dll?
Нет, семантика (в F#) всё равно различается между исполнимыми и неисполнимыми сборками.

Klei
22.10.2018
08:43:47
Короче это, консольный проект. Но есть необходимость юзать так же в другом консольном проекте. Если хорошо пойдет, то может выдеру в либу.

Sergey
22.10.2018
08:46:41
есть возможность широкого выбора слотов (пока US спит) https://twitter.com/sergey_tihon/status/1054280483637473280

Friedrich
22.10.2018
08:49:43
Короче это, консольный проект. Но есть необходимость юзать так же в другом консольном проекте. Если хорошо пойдет, то может выдеру в либу.
Будь с этим предельно осторожен. У нас тут была немного холиварная тема, в рамках которой мы установили, что инициализаторы модулей по-разному вызываются в exe и dll (и это прописано в спеке F#).

Лучше всего, если хочешь что-то гарантировать, вызывай сам явно.

Ilya
22.10.2018
08:57:16
Оно вообще как-то странно инициализирует. Сделал ща модуль в консольном приложении. module Mod do printfn "%s" "Hello from do" let a = printfn "%s" "Hello from a" 1 let b = 0; let f x = 1 + x Так "Hello from do" и "Hello from a" печатется только в том случае, если я обращаюсь к a, если же обращаюсь к b или к f, то ничего не печатается. пример обращения, в котором ничего не печатется. [<EntryPoint>] let main argv = printfn "%A" argv let x = Mod.b x а вот так все печатется [<EntryPoint>] let main argv = printfn "%A" argv let x = Mod.a x

Friedrich
22.10.2018
09:21:39
Ну, если совсем кратко подытожить — в исполняемой сборке модули инициализируются энергично, а в библиотечной сборке — лениво (в соответствии с моделью статических конструкторов в CLI).

Ilya
22.10.2018
09:39:28
Оно вообще как-то странно инициализирует. Сделал ща модуль в консольном приложении. module Mod do printfn "%s" "Hello from do" let a = printfn "%s" "Hello from a" 1 let b = 0; let f x = 1 + x Так "Hello from do" и "Hello from a" печатется только в том случае, если я обращаюсь к a, если же обращаюсь к b или к f, то ничего не печатается. пример обращения, в котором ничего не печатется. [<EntryPoint>] let main argv = printfn "%A" argv let x = Mod.b x а вот так все печатется [<EntryPoint>] let main argv = printfn "%A" argv let x = Mod.a x
С этим все ясно. Оно там генерирует два статических класса. В одном собственно тот статический конструктор, в котором инициализируется a и вызывается do блок. А "b" и "f" никак к тому классу со статическим конструктором не относятся и они прост "заинлайнились" в вызывающий класс. https://sharplab.io/#v2:DYLgZgzgPgtg9gEwK7AKYAICyiCwAodQ9fBOdABwCcBLAOwBcxb0AiAUghdYAlVhgyYSnBjpSLfEWJ409dAEN0AXmlSqdRs3acefAeiEiFEgkQCMkovlnoARsvQAGANyXC11HLDoAHg7foNgBeDvK2EOgAFAC06GYAlOhQAHwGSMx+0al+AFToAEwBIQDUvvhAA=

Karen
22.10.2018
15:15:03
Шустрая цензура

Grigoriy
22.10.2018
15:16:05
Шустрая цензура
Здесь вам не тут!

Vladimir
22.10.2018
19:38:09
I’ve not done much F# recently, and I’ve almost forgot why I loved it so much.

Google
Vladimir
22.10.2018
19:38:19
Теряем людей

Vasily
22.10.2018
19:57:56
Это кто так?

Vladimir
22.10.2018
20:12:11
Твой тезка

Stanislav
22.10.2018
20:26:11
Ребят, привет) Хочу попробовать бота пописать для саморазвития. Есть уже бот написанный на C#. Решил для себя, что ядро лучше на F# наваять, а инфраструктуру (дб контексты и тд) оставить на C#. Есть что то интересное посмотреть, чтобы влиться? На F# не писал, но думаю смогу))

Grigoriy
22.10.2018
20:26:51
у нас тут есть спец по телеботам @Dolfik

Stanislav
22.10.2018
20:28:15
@Dolfik подскажи плиз с чего начать) спасибо

Grigoriy
22.10.2018
20:29:29
Vasily
22.10.2018
20:30:57
Бывает, чо

Grigoriy
22.10.2018
20:35:09
@Dolfik подскажи плиз с чего начать) спасибо
https://vk.com/it34_community?w=wall-164242932_160%2Fall

Nikolay
22.10.2018
20:41:41
Там ничего интересного

Grigoriy
22.10.2018
20:42:27
Там ничего интересного
самокритичненько

Nikolay
22.10.2018
20:44:01
Вообще, боты очень неплохо укладываются в паттерн акторов, но это сложновато для совсем начинающего

Nikolay
22.10.2018
20:54:48
Кстати, как выяснилось, funogram в том виде, в котором он есть, тоже очень неплохо в паттерн акторов укладывается, там есть функции, которые возвращают объект с данными для запроса, и функция, которая принимает этот объект и выполняет запрос, и плюс в том, что этот объект можно свободно передавать в другой актор, например, который будет запросы выполнять.

А изначально я использовал статический класс, с методами и там такое бы не прокатило. Так что вот ещё одна причина придерживаться ФП стиля в фшарп

Grigoriy
22.10.2018
21:30:02
Привет!

Darth
22.10.2018
23:21:11
Я возможно спрошу глупость, но хотя бы узнаю... вообщем, по слухам программы написанные на функциональных языках (при функциональном подходе) быстрее ОО (соответственно). Далее следующие слухи: вставка в мапу в ф# - логарифм, в до-диезе - о(1), и вроде как ещё есть структуры с аналогичным проседанием. Что из указанного враньё? Рассматриваю на примере любой классической задачи с явно определённым входом и выходом, без учёта объема затрачиваемой памяти, и при малом времени на выделение новой памяти☹️

Google
Darth
22.10.2018
23:28:47
map - имутабельная. Dictionary - соотвтственно нет. Но никто тебе не запрещает в ф# использовать его. Я не думаю, что функцональный подход быстрее. Он просто даёт меньше возможностей ошибиться. Ни разу не ловил Collection was modified; enumeration operation might not execute ?
Я же с теоретической стороны спрашиваю:) я поэтому и указал, что «при функциональном подходе», как раз имея ввиду запрет переменных в данном контексте. Получается, что это жертва перформансом в пользу уменьшения числа потенциальных ошибок?

Grigoriy
22.10.2018
23:31:32
Перформанс - относителен. Всегда можно потом попрофилировать и оптимизировать узкие места

Darth
22.10.2018
23:38:08
Я же как раз про теоретический перформанс. Пример - есть какой-нибудь квик сорт. На фп он начнёт проседать. Или к пример хип сорт. И получается, что в лучшем случае эффективность будет такой же как у не фп, в чуть более плохих случаях фп начнёт проседать. И в теории на простых алгоритмах уже не получается. О практике я пока не говорю

Grigoriy
22.10.2018
23:43:00
только квиксорт на ф# - 4 строчки. а на c#?

Roman
22.10.2018
23:43:17
только квиксорт на ф# - 4 строчки. а на c#?
Но это не оптимальный квикстрт будет

Grigoriy
22.10.2018
23:43:41
меньше строк - меньше думать (ну, на самом деле сначала - больше :)) - меньше дефектов

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