
Evgeniy
07.07.2017
09:56:16
Functional Track talks from NDC Oslo 2017
https://gist.github.com/swlaschin/7bf9e8df8854ff964d9f85b6923c02b8

nukolai
07.07.2017
11:00:56
Доброго

Roman
07.07.2017
11:03:13

nukolai
07.07.2017
11:03:46
Живы будем не забудем

Google

Roman
07.07.2017
11:04:23
Я больше про интерес в F# , опыт и тд)

Igor
07.07.2017
17:23:52
О, а ты его куда-нибудь выложил?
Нет, все хочу переписать тк fantomas стартует 5 сек и надо его по хорошему держать запущенным,
а это куда сложнее текущих 10 строчек)) На богомерзком NodeJS это не так тривиально, как в .NET
Плюс надо бы еще с TS на F# Fable переписать, да еще и конфига форматирования добавить - короче работы еще полно.

Evgeniy
07.07.2017
19:10:43
Я интересного кода принес из слэка.
let implicit (/) (s: string) (i: int) = int s / i
Никогда раньше такого не видел.

Igor
07.07.2017
19:18:12
А это компилируется? (пишу с телефона)

Evgeniy
07.07.2017
19:18:27

Nikolay
07.07.2017
19:20:23
А как в F# mock'аются функции?
Т.е., например функция возвращает какие-то данные, как для неё сделать тест?

Летучая
07.07.2017
19:21:46
FsUnit использую

Nikolay
07.07.2017
19:22:25

Ivan
07.07.2017
19:22:50
Expecto

Roman
07.07.2017
19:23:15
FSCheck

Google

Летучая
07.07.2017
19:23:30
Foq ещё

Nikolay
07.07.2017
19:23:34
Меня интересует именно сам механизм, как это работает?
И вообще, реализуемо ли это

Летучая
07.07.2017
19:23:59
Похоже на билдеры (но это неточно)

Ivan
07.07.2017
19:25:13
В fsharp mocki очень просты - если в функциональном стиле. Предположим, надо тестануть:

Nikolay
07.07.2017
19:25:16

Ivan
07.07.2017
19:25:34
let f a b c = ...
Гду а и b - функции (() - int) (int -> int -> string).
Так с моками проблем нет:
mocka () = 5
mockb a b = "6"

Nikolay
07.07.2017
19:32:19
Допустим есть модуль:
module RandomNumberGenerator
let getRandomNumber min max = Random().Next(min, max)
Как для функции getRandomNumber написать заглушку, типа такой:
let getRandomNumber min max = Random(0).Next(min, max)

Evgeniy
07.07.2017
19:32:27
То есть нужна параметризация.
Иных выходов я не вижу.

Nikolay
07.07.2017
19:37:16
В императивном стиле понятно как сделать, через интерфейс и DI, а вот в функциональном, хз

Ed
07.07.2017
19:37:24
мне помог прийти в ML - Elm

Evgeniy
07.07.2017
19:38:58

Vlad
07.07.2017
19:42:15

Igor
07.07.2017
19:42:40

Google

Nikolay
07.07.2017
19:44:17
Я просто банально не могу придумать, как в данном кейсе обойтись без интерфейса
Как-бы можно сделать интерфейс для Random, и отдельные реализации, другого выхода просто не вижу

Evgeniy
07.07.2017
19:46:12
@Dolfik Чем не подходит описанное мной решение?

Nikolay
07.07.2017
19:46:57

Pavel
07.07.2017
19:47:22
Не понятно, что мешает написать в тесте функцию заглушку и передать ее в тестируюмую. Вроде ж проще чем с интерфейсами

Nikolay
07.07.2017
19:49:58

Pavel
07.07.2017
19:51:27
можешь попробовать вариант с рекордом

Igor
07.07.2017
19:57:18
А потом этот рекорд назвать контекстом и в reader монаду засунуть и приехали, твой рекорд юзается по всему коду.

Evgeniy
07.07.2017
20:02:45
@Dolfik Да, тут бы еще подумать, зачем тестируемой функции нужно вызывать функцию-рандом, а не просто принимать число. :)

Nikolay
07.07.2017
20:02:46
Singleton Же :D

Evgeniy
07.07.2017
20:05:03
То же и про функцию, которая вызывает пять других функций с сайд-эффектами. Может ее можно разбить на несколько чистых функций, которые легко тестируются?
Но это лучше на конретных примерах смотреть. Я думаю, @angmarr поможет, как знаток dependency rejection. :)

Vasily
07.07.2017
20:23:22
С таким переопределением функции куча способов отстрелить себе ногу

Evgeniy
07.07.2017
20:24:28
Там даже передаваемый оператор (/) не используется.

Vasily
07.07.2017
20:26:02
А кто у нас ActorPath?

Roman
07.07.2017
20:26:24

Vasily
07.07.2017
20:26:25
Я с телефона просто пока

Google

Evgeniy
07.07.2017
20:26:26

Roman
07.07.2017
20:26:30
Считай что строка для простоты

Vasily
07.07.2017
20:27:08
А, там просто некий коэффициент считается
Что-то типа ранга,как я понимаю
И используется скорее всего при балансировке
Но вообще решение спорное

Evgeniy
07.07.2017
20:28:54
Vasily Мне кажется, ты пропустил то, то там не let inline, а let implicit. :)
Наверное, это опечатка. Плохо, что компилируется. :)

Vasily
07.07.2017
20:31:59
Не,не опечатка,думаю

Evgeniy
07.07.2017
20:32:25
В чем тогда смысл?

Vasily
07.07.2017
20:35:09
Хотя кейворда такого нет в языке
А смысл походу в преобразовании типов
Без прямого приведения

Evgeniy
07.07.2017
20:36:50
Нету такого в F#.
Смотри.
Вот это:
let implicit (/) (s: string) (i: int) = int s / i
Компилируется в:
public static a @implicit<a>(FSharpFunc<int, FSharpFunc<int, a>> op_Division, string s, int i)
{
return FSharpFunc<int, int>.InvokeFast<a>(op_Division, LanguagePrimitives.ParseInt32(s), i);
}
Это точно опечатка.
Если ты промахнулся и в определении оператора написал вместо inline что-либо, то такой код все равно скомпилируется.
Например, injline. %)

Vasily
07.07.2017
20:46:25
А, тогда опечатка

Google

Vasily
07.07.2017
20:47:08
Но все равно переопределение оператора,чтобы компилятор ниже не требовал прямого приведения типа

Nikolay
07.07.2017
21:22:23
Ковыряюсь тут с Funogram, получилось что-то типа такого:
let bot data = api botToken data |> Async.RunSynchronously
bot (sendMessage chatId "Hello, World!")
Мне кажется это лучше, чем:
Telegram.SendMessage(token, chatId, "Hello, World!")

Летучая
07.07.2017
21:24:49
IntelliSence работать не будет!

Ivan
07.07.2017
21:25:08
Вот почему нельзя делать generic module?

Nikolay
07.07.2017
21:29:00

Ivan
07.07.2017
21:37:44
В условиях на параметры generic
В ML можно.

Roman
07.07.2017
21:39:14
Привет!

Ivan
07.07.2017
21:46:59
Сейчас вот пишу систему конфигурирования. Предположим есть нечто обладающее свойствами. Тип именисвойства можно абстрагировать. Идентичность свойств определяется некоторым условием. Удобно задать как IEqualityComparer<T>. Задаемначальные свойства, правила вывода новых. Привязку к условиям новых. Комбинаторы. Получается интересно. Пока совсем прототип. Но было бы меньше кода при генериках на модулях

Evgeniy
08.07.2017
05:21:14
Привет. :)
Пожалуйте.

Friedrich
08.07.2017
06:25:58