
Vladimir
31.10.2017
20:34:16
справедливость восстановлена)
правда не вижу где там смотреть расход по памяти

Aleksander
31.10.2017
20:46:02
MemoryDiagnoser атрибут висит? По идее он показывает.

Vladimir
31.10.2017
20:51:50
Method | Mean | Error | StdDev | Gen 0 | Allocated |
------- |-----------:|----------:|----------:|-------:|----------:|
Choice | 15.4220 ns | 0.3461 ns | 0.6329 ns | 0.0152 | 48 B |
Result | 0.0393 ns | 0.0222 ns | 0.0207 ns | - | 0 B |

Google

Vladimir
31.10.2017
20:52:50
Все как в теории
Вот код бенчмарка если что
https://pastebin.com/sQDWYreA

Igor
31.10.2017
21:40:46
Кто-нибудь следит за тайпклассами в f#?

Artemy
31.10.2017
22:28:30
@gsomix, вроде. По крайней мере, за SRTP точно следил ещё недавно.
Как я понял, с настоящими тайпкласссами ждут, пока прояснится ситуация с ними в C#, да и в CLR в целом. Ну а в F# в ближайшее время стоит ждать лишь улучшений для SRTP, которое позволит делать штуки, более близкие по возможностям к тайпклассам.
Вот, нашёл-таки ссылку на вышеупомянтую фичу:
Нян.
https://github.com/Microsoft/visualfsharp/pull/3582#issuecomment-332628580
И используй, что нужно, в зависимости от ситуации

Evgeniy
01.11.2017
04:13:08
Понятно, почему в твоем случае Result работает быстро. У тебя очень простой код, все инлайнится компилятором, никаких лишних копирований.

Google

Evgeniy
01.11.2017
04:15:37
Vladimir Нужно добавить bind, короче, посмотреть, как Result будет вести себя в цепочках.

Vladimir
01.11.2017
04:58:19
Ну у меня была задача убедиться что по крайней мере не всегда резалт медленней

Evgeniy
01.11.2017
05:06:13

Vladimir
01.11.2017
05:13:01
Рассмотрим)

Evgeniy
01.11.2017
06:33:48
Vladimir В слаке вот такой результат появился для того же кода.
Method | Mean | Error | StdDev | Scaled | ScaledSD | Gen 0 | Allocated |
------- |---------:|---------:|---------:|-------:|---------:|-------:|----------:|
Choice | 117.3 ns | 2.894 ns | 2.707 ns | 1.00 | 0.00 | 0.0494 | 312 B |
Result | 181.2 ns | 1.866 ns | 1.654 ns | 1.55 | 0.04 | 0.0203 | 128 B |
BenchmarkDotNet=v0.10.9, OS=Mac OS X 10.12
Processor=Intel Core i7-4980HQ CPU 2.80GHz (Haswell), ProcessorCount=8
.NET Core SDK=2.0.0
> Mac OS X
Это интересно.

Vladimir
01.11.2017
06:55:53
очень

Pavel
01.11.2017
07:13:01

Evgeniy
01.11.2017
07:13:33

Klei
01.11.2017
07:20:56
Мне внезапно понадобился (но это неточно) иммутабельный json, есть что-нибудь готовое?
Т.е. нужна F# либа с иммутабельным JObject.

Evgeniy
01.11.2017
07:24:11

Klei
01.11.2017
07:27:18


Dmitriy
01.11.2017
09:46:53
Коллеги, всем привет. Посмотрел видео с обучающим роликом по Excel нахождения самой длинной победной сериии https://www.youtube.com/watch?v=edZ1Sa49mE0&t=77s.
Заинтересовало, как было бы это на базовом F#. Реализовал пример, получилось:
let timeScheet = [
"Вера", [ 4; 0; 9; 2; 4; 0; 7 ]
"Сергей", [ 5; 5; 4; 8; 0; 5; 0 ]
"Василиса", [ 3; 3; 6; 9; 5; 0; 7 ]
"Милина", [ 0; 3; 5; 0; 0; 9; 4 ]
"Екатерина", [ 5; 0; 9; 0; 1; 0; 6 ]
"Илья", [ 0; 6; 5; 0; 6; 5; 0 ]
"Ольга", [ 2; 4; 9; 8; 4; 8; 7 ]
]
let folder = fun state item ->
if item = 0 then
0::state
else
match state with
| x::xs -> (x + 1)::xs
| [] -> 1::state
let getLongestSeries series =
series
|> List.fold folder List.empty<int>
|> List.max
timeScheet
|> List.map ( fun (name,sheet) -> name, getLongestSeries sheet )
// Output:
// val it : (string * int) list =
// [("Вера", 3);
// ("Сергей", 4);
// ("Василиса", 5);
// ("Милина", 2);
// ("Екатерина", 1);
// ("Илья", 2);
// ("Ольга", 7)]
Как по вашему мнению можно упростить функцию folder?


Pavel
01.11.2017
09:56:34
ой нет
тупанул, да =D
let getLongestSeries series =
let rec f arr c max =
match arr with
| [] -> List.max [max; c]
| 0 :: xs -> f xs 0 (List.max [max; c])
| x :: xs -> f xs (c + 1) (List.max [max; c])
f series 0 0
немного упростить можно:
let getLongestSeries series =
let rec f arr c max =
match arr with
| [] -> List.max [max; c]
| 0 :: xs -> f xs 0 (List.max [max; c])
| x :: xs -> f xs (c + 1) max
f series 0 0


Klei
01.11.2017
10:08:36
Коллеги, всем привет. Посмотрел видео с обучающим роликом по Excel нахождения самой длинной победной сериии https://www.youtube.com/watch?v=edZ1Sa49mE0&t=77s.
Заинтересовало, как было бы это на базовом F#. Реализовал пример, получилось:
let timeScheet = [
"Вера", [ 4; 0; 9; 2; 4; 0; 7 ]
"Сергей", [ 5; 5; 4; 8; 0; 5; 0 ]
"Василиса", [ 3; 3; 6; 9; 5; 0; 7 ]
"Милина", [ 0; 3; 5; 0; 0; 9; 4 ]
"Екатерина", [ 5; 0; 9; 0; 1; 0; 6 ]
"Илья", [ 0; 6; 5; 0; 6; 5; 0 ]
"Ольга", [ 2; 4; 9; 8; 4; 8; 7 ]
]
let folder = fun state item ->
if item = 0 then
0::state
else
match state with
| x::xs -> (x + 1)::xs
| [] -> 1::state
let getLongestSeries series =
series
|> List.fold folder List.empty<int>
|> List.max
timeScheet
|> List.map ( fun (name,sheet) -> name, getLongestSeries sheet )
// Output:
// val it : (string * int) list =
// [("Вера", 3);
// ("Сергей", 4);
// ("Василиса", 5);
// ("Милина", 2);
// ("Екатерина", 1);
// ("Илья", 2);
// ("Ольга", 7)]
Как по вашему мнению можно упростить функцию folder?
let scanBased series =
series
|> Seq.scan (fun state -> function 0 -> 0 | _ -> state + 1) 0
|> Seq.max
let folderBased series =
series
|> List.fold (fun (maximum, current) ->
function
| 0 -> max maximum current, 0
| _ -> maximum, current + 1)
(0,0)
||> max
timeScheet
|> List.map ( fun (name,sheet) -> name, getLongestSeries sheet, scanBased sheet, folderBased sheet )

Google

Dmitriy
01.11.2017
10:15:45

Roman
01.11.2017
11:15:06
http://fpconf.ru/

Dmitry
01.11.2017
11:18:16
ну а в Минске 17 декабря http://fby.by

Artemy
01.11.2017
11:23:09
Дороговато ?

Aleksey
01.11.2017
11:33:27
Что дороговато? fbyby, это 3К рублей российских
FPConf подороже, но в Мск найти дешёвую площадку - та ещё проблема
Ну и 5К для московской конфы, это вполне нормальная цена.
К тому же всегда есть возможность не платить - нужно всего лишь пойти докладчиком :)

Igor
01.11.2017
11:41:26

Artemy
01.11.2017
11:45:33
Не, ну если серьёзно, то для конфы это, наверное, более менее оправданная цена, да.

Aleksey
01.11.2017
12:39:05
?
Часто так делаю :) Вот и на FPConf буду докладывать :)

Friedrich
01.11.2017
12:43:19

Igor
01.11.2017
13:05:07

Friedrich
01.11.2017
13:06:13
Мне непонятен запрос.

Google

Friedrich
01.11.2017
13:06:33
Наверное, никак не будет выглядеть.

Igor
01.11.2017
13:08:29
В хаскеле есть тайпклассы и соответственно определение return вот:
class Monad m where
return :: a -> m a
…
Мне интересно, как оно будет в F#, если тайпклассы добавят без HKT

Friedrich
01.11.2017
13:08:42
Никак не будет выглядеть, я же сказал :)
Будет как в хаскеле, но без вот этого определения class.
SRTP же.

Igor
01.11.2017
13:08:57
Те монадок, не будет

Friedrich
01.11.2017
13:09:01
Будут.

Igor
01.11.2017
13:09:07
Давай синтаксис

Friedrich
01.11.2017
13:09:11
Монадки уже есть, какие угодно.
Список, например.

Artemy
01.11.2017
13:09:58
Речь о Computation Expressions же, да?

Friedrich
01.11.2017
13:09:59
Синтаксис для «определения тайпкласса» будет пустым множеством.
Просто не пишешь определений и всё. Сразу пишешь код, который обобщённо использует инстансы тайпклассов.

Artemy
01.11.2017
13:10:38
Сошников в своей книге даже перевёл Computation Expressions как "Монадические выражения".

Friedrich
01.11.2017
13:11:01

Artemy
01.11.2017
13:11:46
А, о представлении монад через SRTP?

Friedrich
01.11.2017
13:11:52
Да, скорее об этом.
Только не про монады, а про тайпклассы вообще.

Igor
01.11.2017
13:12:45
C SRTP вроде уже обсуждали, что нельзя будет расширить сторонние классы.
Это так и осталось?

Google

Artemy
01.11.2017
13:12:59
Нян.
https://github.com/Microsoft/visualfsharp/pull/3582#issuecomment-332628580

Friedrich
01.11.2017
13:13:17
На этом примитиве можно сделать то же самое, что тайпклассами.
А дальше нужно будет просто их немножко сахарком обмазать (ну, я согласен, что хочется видеть их в виде отдельных определений, а не кучи SRTP-констрейнтов на каждый метод).
Но тогда можно будет даже какую-то надстройку над компилятором соорудить, которая бы позволяла именовать группы таких констрейнтов. И вот вам уже и готовые тайпклассы, в общем-то.

Evgeniy
01.11.2017
13:15:31
И функцию return, которая будет через SRTP вытаскивать нужные перегрузки.

Friedrich
01.11.2017
13:16:23

Evgeniy
01.11.2017
13:16:28
Вон как хитро сейчас сделано в FSharpPlus.
https://github.com/gusty/FSharpPlus/blob/master/src/FSharpPlus/Functor.fs#L103
@angmarr ^
Этот код значительно упростится, когда SRTP научится видеть методы расширения.

Friedrich
01.11.2017
13:17:04
Самое хитрое в FSharpPlus — это название. Никак не могу его запомнить :(

Evgeniy
01.11.2017
13:18:10
Я вижу один минус у всей этой истории с тайпклассами через SRTP.
Это влияет на время компиляции.
Раньше было совсем невыносимо, но к F#4.1 немного поправили производительность.

Friedrich
01.11.2017
13:18:58
Будет надо — ещё поправим.

Vladimir
01.11.2017
13:20:53
https://pastebin.com/ibW9SAAf
| Method | Mean | Error | StdDev | Gen 0 | Allocated |
|----------- |-----------:|----------:|----------:|-------:|----------:|
| Choice | 11.9967 ns | 0.2645 ns | 0.3149 ns | 0.0152 | 48 B |
| Result | 0.0000 ns | 0.0000 ns | 0.0000 ns | - | 0 B |
| ResultBind | 17.9475 ns | 0.3891 ns | 0.4480 ns | - | 0 B |
| ChoiceBind | 27.1420 ns | 0.6881 ns | 1.5531 ns | 0.0305 | 96 B |