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

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

Google

Grigoriy
21.10.2018
12:42:59

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
Я не про синтетику. Я про реальные задачи

Ayrat
21.10.2018
12:48:55

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

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

Klei
22.10.2018
08:19:09

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

Google

Ayrat
22.10.2018
08:32:01
всё что написано в модулях - вычислится в порядке загрузки модулей
module A =
let a =
printfn "1"
0
при загрузке модуля будет сайд эффект!

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

Ayrat
22.10.2018
08:39:24

Friedrich
22.10.2018
08:40:30

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

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

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
Лучше всего, если хочешь что-то гарантировать, вызывай сам явно.

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

Klei
22.10.2018
09:07:40

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

Ilya
22.10.2018
09:39:28


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

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

Grigoriy
22.10.2018
20:42:27

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

Stanislav
22.10.2018
20:50:57

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

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

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

Grigoriy
22.10.2018
23:25:56

Google

Darth
22.10.2018
23:28:47

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

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