
Владислав
05.01.2018
12:18:31
x |> (List.max >> (-) List.min)

Evgeniy
05.01.2018
12:19:41

Владислав
05.01.2018
12:19:58
максимальный элемент в листе минус минимальный

Klei
05.01.2018
12:22:36

Google

Владислав
05.01.2018
12:26:30
а это как?)

Artemy
05.01.2018
12:26:48
List.fold

A64m
05.01.2018
12:29:39
а для f# что-ли еще нету какой-нибудь имплементации бьютифул фолдс a la хаскельных пакетов foldl и folds ?

Владислав
05.01.2018
12:30:52

Artemy
05.01.2018
12:30:53
List.fold
Вообще, в данном случае чуть удобнее List.reduce
А я вот только сейчас начал думать и пока не придумывается, как "максимальный элемент в листе минус минимальный" через свёртку сделать ?

Anna
05.01.2018
12:34:59

Artemy
05.01.2018
12:36:04
Ну да, точно

Владислав
05.01.2018
12:36:34
и чтоб прямо анонимно?
без перемнных?

Anna
05.01.2018
12:37:22
Вам шашечки или ехать? :)

Владислав
05.01.2018
12:37:49
мне чтоб декларативно
через переменные уже из C# умеем)

Google

Artemy
05.01.2018
12:47:48
Вот, в общем, я такое накидал для нахождения пары "минимум-максимум" в списке одним проходом с помощью List.fold:
let minAndMax =
function
| [] -> Error "The function is invalid for empty list"
| xs ->
let hd = List.head xs
xs |> List.fold (fun (mn, mx) x -> min mn x, max mx x) (hd, hd) |> Ok
Надеюсь, всё правильно

Владислав
05.01.2018
12:51:00
еще б как-то вычесть их

Artemy
05.01.2018
12:51:22
Ну там же пара возвращается

Владислав
05.01.2018
12:51:48
а без сохранения как это сделать?

Artemy
05.01.2018
12:52:02
xs |> minAndMax |> fun (mn, mx) -> mx - mn

Владислав
05.01.2018
12:52:36
спасибище!)

Evgeniy
05.01.2018
12:53:51

Artemy
05.01.2018
13:00:08
Типа foldBack?

Evgeniy
05.01.2018
13:01:12

Artemy
05.01.2018
13:01:49
А какая разница?)

Evgeniy
05.01.2018
13:02:09
Тогда можно будет (-) заюзать.
Нам же из максимального минимальный нужно вычесть?

Artemy
05.01.2018
13:02:40
А (-) не каррированная функция?

Evgeniy
05.01.2018
13:03:29
Ну, заюзай uncurry.

Artemy
05.01.2018
13:04:08
А это уже не короче и не удобнее, чем fun (mn, mx) -> mx - mn
Ну, по моему мнени

Evgeniy
05.01.2018
13:04:46
Если у тебя uncurry уже есть в прилюдии, то удобно. :)

Artemy
05.01.2018
13:05:30
Ну будет выглядеть чуть более выпендрёжно. ?
Мол, смотрите, какой я функциональщик

Google

Evgeniy
05.01.2018
13:06:16

Artemy
05.01.2018
13:06:28
Точно
xs |> minAndMax |> Result.map (fun (mn, mx) -> mx - mn)
Вообще, вместо Result можно и исключение было кинуть
List.head так делает
Ну или Option. И назвать функцию tryMinAndMax. Тогда это будет больше соответствовать определениям других функций в стандартной библиотеке

Evgeniy
05.01.2018
13:09:28
let minMax = function
| [] -> Error "The function is invalid for empty list"
| x::xs ->
xs |> List.fold (fun (mx, mn) x -> max mx x, min mn x) (x, x) |> Ok
let uncurry f (a, b) = f a b
let diffMinMax = minMax >> Result.map (uncurry (-))
Ну, c uncurry не так и плохо выглядит.

Artemy
05.01.2018
13:10:02
Ну так, не сразу ясно, что тут происходит
М.б. только для тех, кто привык часто curry/uncurry вкупе с бесточечным стилем использовать

Evgeniy
05.01.2018
13:11:23
Ну да.
Но Владислав хотел декларативно. Можно и дожать. :)

Artemy
05.01.2018
13:12:05
Ну это не декларативнее, чем вариант с обычной лямбдой

Evgeniy
05.01.2018
13:19:29

Artemy
05.01.2018
13:20:05
Ну мне кажется, это менее удобно при чтении кода
Тут нужно знать меру в использовании всяких функциональных фишек

Evgeniy
05.01.2018
13:20:37
Да, зависит.

A64m
05.01.2018
13:22:58
декларативнее было бы
> F.fold (fmap fromJust F.maximum - fmap fromJust F.minimum) [2 .. 10]
8
ну или
> F.fold (F.maximum - F.minimum) [2 .. 10]
8
если бы минимум и максимум возвращали не опциональный результат
ну или при соотв. перегрузке арифметики для опциональных значений

Evgeniy
05.01.2018
13:43:18

Google

A64m
05.01.2018
13:43:41
да

Evgeniy
05.01.2018
13:44:34
Спасибо.

Владислав
05.01.2018
14:18:04
круто)

Evgeniy
05.01.2018
18:41:51
Привет.

Timur
05.01.2018
18:42:03
Привет

Pavel
05.01.2018
20:24:31

Evgeniy
05.01.2018
20:42:24

Igor
06.01.2018
10:04:02
Это та самая?
И снова про F# — ловите выпуск подкаста Hanselminutes с Alena Hall!
https://thesoundof.net/shows/4476-functional-programming-f-and-cloud-containers

Evgeniy
06.01.2018
10:31:39
Да.

Anna
06.01.2018
11:47:23
Я там тем временем закоммитила черновик своего перевода. Местами я не знаю, как красиво перевести, и могу устоявшуюся терминологию на русском не знать
В любом случае, сильно тапками не бейте :)

Evgeniy
06.01.2018
11:48:07
Ничоси!
@AnutaU Где смотреть? Сделаешь PR?

Anna
06.01.2018
11:48:43
@AnutaU Где смотреть? Сделаешь PR?
в моём форке
https://github.com/AnnaUdovichenko/translations/blob/master/Finer%20Points%20of%20F%23%20Value%20Restriction/Finer%20Points%20of%20F%23%20Value%20Restriction.md

Evgeniy
06.01.2018
11:50:48
Отлично. Я прочитаю вечером.

Anna
06.01.2018
11:52:19
Надо самой ещё разок прочитать хотя бы ? а то я так торопилась поделиться радостью...

Evgeniy
06.01.2018
11:53:32
Хех, спасибо. :)

Roman
06.01.2018
13:34:15

Anna
06.01.2018
13:35:10
Ну, там ещё довольно много работы

Google

Vladimir
06.01.2018
13:45:09
string myFunc()
{
var x;
try
{
x = badFunc();
}
catch
{
return "Error";
}
//much code
return goodFunc(x,y,z);
}
Такое вообще можно в фшарпе написать? Мне пока приходит на ум только весь код после кэтча внутрь трая запихнуть, но это как-то некрасиво, хочется только опасную функцию обернуть

P
06.01.2018
14:52:24
А откуда вообще ошибка падает? Может лучше badFunc заставить возвращать Option/Result?

Vladimir
06.01.2018
14:52:39
Неа, это либа
Официальная гугловская либа для авторизации через гугл)

Pavel
06.01.2018
14:52:56
Ну всегда же можно обернуть

Vladimir
06.01.2018
14:55:09
Мм, хорошая идея)

Oleg
06.01.2018
15:12:43

Vladimir
06.01.2018
15:24:22
Я только токен клиентский проверяю, не вызывая никакого апи, хз как это называется)

Aminion
06.01.2018
18:40:18
Все силюсь понять, как строить фп программы, непонимание касается естественно сайдэффектов. Видел, в хаскелле разруливают тайпклассы, компилятор знает о зависимостях из инстанса класса. Но что в фшарпе? Я не могу найти такого же удобного механизма, как контейнер зависимостей. Который за меня будет строить граф зависимостей, как это происходит в мейнстриме. Есть что почитать по теме?
О депенданси редежекшн осведомлен, повышает процент пьюр кода, отлично, но что с остальным кодом?

Vladimir
06.01.2018
18:54:16
Вроде нету такого =) Если писать серверное приложение, то могу посоветовать просто разбивать на микросервисы, соответственно никогда не будет много зависимостей, достаточно частичного применения в композишн руте. Если большое клиентское приложение, то хз. У меня например серверное и количество пьюр кода стремится к нулю)
А вот была статья до чего люди доходят https://robkuz.github.io/Dependency-Management/

Pavel
06.01.2018
19:18:40

Aminion
06.01.2018
19:19:46
Заменяет, да, это прямо аналог, Симан пояснял
Есть ли контейнер, который через рефлексию апплаит зависимости?

Pavel
06.01.2018
19:21:30

Aminion
06.01.2018
19:22:10
Угу, можно и нинжект юзать, хотет фп вей

Pavel
06.01.2018
19:23:08

Aminion
06.01.2018
19:23:32
Но это жи больно

Pavel
06.01.2018
19:29:04
Но это жи больно
Не больнее чем ioc контейнеры. В ооп стиле, ты бы создал интерфейс, прокинул бы его в конструктор класса, и зарегал бы его в контейнере. В фп стиле у тебя есть функция, которая принимает другую функцию в качестве зависимости (читай интерфейс), и где-то в корне твоего приложения делается частичное применение с нужной зависимостью. Это даже проще, так как нет лишней сущности в лице интерфейса, ну и тестирование так же упрощается.