@Fsharp_chat

Страница 390 из 772
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

Смотрите, какая интересная штука. https://twitter.com/kot_2010/status/925415377605218304
? В общем, я понял. И для Result, и для Option нужны варианты как struct, так и обычные ссылочные.

И используй, что нужно, в зависимости от ситуации

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
очень

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

Т.е. нужна F# либа с иммутабельным JObject.

Evgeniy
01.11.2017
07:24:11
Т.е. нужна F# либа с иммутабельным JObject.
FSharp.Data? Там есть JsonValue, который обычный DU.

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
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
К тому же всегда есть возможность не платить - нужно всего лишь пойти докладчиком :)
Вот бы в СПб, а то еще 5к на сапсан (и 8 часов) тратить не хочется

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

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

Friedrich
01.11.2017
12:43:19
Кто-нибудь следит за тайпклассами в f#?
Да, я слежу. После ближайших доработок SRTP можно будет писать тайпклассы. Ну а дальше там есть ещё пара сахарных задачек, чтоб было поудобнее.

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
Речь о Computation Expressions же, да?
Не, мы не совсем об этом сейчас рассуждаем.

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
C SRTP вроде уже обсуждали, что нельзя будет расширить сторонние классы. Это так и осталось?
Да, обсуждали, и нельзя (без будущего времени) расширить сторонние классы. А будет можно как раз.

На этом примитиве можно сделать то же самое, что тайпклассами.

А дальше нужно будет просто их немножко сахарком обмазать (ну, я согласен, что хочется видеть их в виде отдельных определений, а не кучи SRTP-констрейнтов на каждый метод).

Но тогда можно будет даже какую-то надстройку над компилятором соорудить, которая бы позволяла именовать группы таких констрейнтов. И вот вам уже и готовые тайпклассы, в общем-то.

Evgeniy
01.11.2017
13:15:31
Можешь накидать синтаксис, как будет выглядеть pure (return) монадный?
Хороший вопрос. Пишешь метод расширения Return для нужного тебе типа.

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

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 |

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