@Fsharp_chat

Страница 446 из 772
Владислав
05.01.2018
12:18:31
x |> (List.max >> (-) List.min)

Evgeniy
05.01.2018
12:19:41
x |> (List.max >> (-) List.min)
А что ты хочешь сделать?

Владислав
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
List.fold
а можно пример плиз?

Artemy
05.01.2018
12:30:53
List.fold
Вообще, в данном случае чуть удобнее List.reduce

А я вот только сейчас начал думать и пока не придумывается, как "максимальный элемент в листе минус минимальный" через свёртку сделать ?

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
спасибище!)

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

Evgeniy
05.01.2018
13:01:12
Типа foldBack?
Нет, я про порядок в кортеже.

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
xs |> minAndMax |> fun (mn, mx) -> mx - mn
А тут ты забыл про Result.

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 если бы минимум и максимум возвращали не опциональный результат

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

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
uncurry = (<||)
А curry нет, неконсистентно. :)

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
Хех, спасибо. :)

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

Google
Vladimir
06.01.2018
13:45:09
И снова про F# — ловите выпуск подкаста Hanselminutes с Alena Hall! https://thesoundof.net/shows/4476-functional-programming-f-and-cloud-containers
Круто, я ровно к тем же технологиям пришел - фшарп, кубернетес, кафка =) Вот только стриминг апи для дотнета не хватает)

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
Мм, хорошая идея)

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/

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
Угу, можно и нинжект юзать, хотет фп вей
Делать partial application руками, без всяких reflection и ioc

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

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

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