@Fsharp_chat

Страница 561 из 772
Владислав
23.04.2018
08:28:37
Если пустота, то seq с одним дефолтным значением для этого типа

Vasily
23.04.2018
08:31:23
Seq.init

Roman
23.04.2018
08:44:25
Привет!

Danil
23.04.2018
08:45:06
Всем привет!)

Google
Pavel
23.04.2018
08:55:20
https://pastebin.com/VL6ZWa7k
похоже? let punches = _unitOfWork.PunchRepository.All |> Seq.groupBy (fun punch -> punch.DragonId) |> dict [ for dragon in _unitOfWork.DragonRepository.All do match punches.TryGetValue dragon.Id with | true, x -> yield dragon, x | _ -> yield dragon, seq {} ]

Vasily
23.04.2018
09:26:25
Хммм, не знал, что так можно: let K x y = x in List.map (K 3) [ 1; 2; 3; 4 ]

Roman
23.04.2018
09:50:11
Не понял

Четыре тройки?

Vasily
23.04.2018
09:50:46
Ну это короткая запись вместо двух строк

Roman
23.04.2018
09:50:59
Ну это короткая запись вместо двух строк
Ага, но я не понял что оно должно делать

Vasily
23.04.2018
09:51:33
НУ я тоже пока особо не присматривался :)

Pavel
23.04.2018
11:34:36
Artemy
23.04.2018
11:40:59
Четыре тройки?
По идее, должен получиться список из четырёх функций одного аргумента

Pavel
23.04.2018
11:42:33
[3; 3; 3; 3]

Google
Artemy
23.04.2018
11:50:09
А, точно. в качестве y будут элементы списка. Сглупил я

Roman
23.04.2018
12:47:51
Как же не хватало такой полезности

fable-react/using-third-party-react-components.md at master · fable-compiler/fable-react https://github.com/fable-compiler/fable-react/blob/master/docs/using-third-party-react-components.md

Привет!

Mikhail
24.04.2018
15:35:08
Подскажите, как лучше работать с коллекциями. LINQ подойдет или есть аналоги?

Mikhail
24.04.2018
15:37:49
linq + мозг
Type-safe обверток в коробке не идет?

В частности, интересует аналог Single, возвращающий Option

Vasily
24.04.2018
15:39:26
tryFind

Тьфу

tryFilter

Денис
24.04.2018
15:39:50
tryFind как раз

Vasily
24.04.2018
15:39:51
Только он первый попавшийся дает

Mikhail
24.04.2018
15:40:12
То что нужно, благодарю

Roman
24.04.2018
15:43:17
Поизучал pandas и теперь понял зачем нужен Deedle в F# теперь было бы интресно сравнить одно с другим.

Artemy
24.04.2018
15:51:12
Только вот Deedle давно не обновлялся

Интересно, что за BlueMountainCapital. Вроде, в последнее время о них ничего не слышно в мире F#.

Владислав
25.04.2018
11:59:21
привет. Подскажите, пожалуйста. Необходимо найти сумму по определенному свойству( использую record), но seq может содержать null записи. Как это можно красиво сделать?

Roman
25.04.2018
12:24:29
это как так? Используете рекорды, но возможны нуллы

Google
Владислав
25.04.2018
12:26:45
Roman
25.04.2018
12:29:58
как вариант, можно отфильтровать нуллы. Или можно бахнуть mySeq |> Seq.map Option.ofObj и работать с опшнами, если удобней

Владислав
25.04.2018
12:35:08
а вот не получается так( Option.ofObj - the type does not have null as a proper value

Roman
25.04.2018
12:36:38
ну тут есть грязный хак [<AllowNullLiteral>], но надо дважды подумать, прежде чем его использовать

Владислав
25.04.2018
12:39:50
видел да, но должен же быть нормальный способ

это ж основа бизнесс приложения группировка и агрегация

Roman
25.04.2018
12:46:06
тогда фильтровать. Если с нуллом не получается сравнить, есть еще Uncheked.defaultof<>

Ну или кстати можно свой кастомный маппинг на Option так же сделать

Klei
25.04.2018
12:59:32
Можно коротко, но грубо: Seq.choose (box >> tryUnbox<MyType>) .

Roman
25.04.2018
14:37:27
Привет!

Oleg
25.04.2018
14:38:53
Привет!
Привет)

Pavel
25.04.2018
17:45:00
а вот не получается так( Option.ofObj - the type does not have null as a proper value
так откуда nullы то взялись если рекорды ими не становятся?

Klei
26.04.2018
07:33:22
так откуда nullы то взялись если рекорды ими не становятся?
F# запрещает null только на этапе компиляции в F# коде. null легко может вылезти в качестве непроиниализированного поля в C# или рассчитанных на C# сериализаторов и пр.

Roman
26.04.2018
07:46:22
F# запрещает null только на этапе компиляции в F# коде. null легко может вылезти в качестве непроиниализированного поля в C# или рассчитанных на C# сериализаторов и пр.
Но это возможно либо при работе с определенными в C# типами, которые, насколько помню, можно сравнивать с null, либо совсем хитрый кейс, когда F# тип был инициализирован как null в C# коде. Ну либо если был вызван Unchecked.defaultof

Или я неправ?

Vasily
26.04.2018
07:47:01
Ну можно ещё атрибут вешать

Vasily
26.04.2018
07:47:20
Из архитектуры стороннего кода, вестимо

Klei
26.04.2018
07:47:47
это не отменяет вопрос откуда nullы
Вариант: пришло из бд не катит?

Google
Pavel
26.04.2018
07:49:14
не знаю. в бд запись или есть или ее нет. понятия нулл записи нет. поля есть, а записи нет

Vlad
26.04.2018
07:49:25
Вариант: пришло из бд не катит?
не хочу врать, но option в моделях для того же даппера спасает от этой проблемы

Roman
26.04.2018
07:49:30
Ну можно ещё атрибут вешать
Ну этот кейс мы уже обсуждали выше. Нуллы появились без него

Klei
26.04.2018
07:50:59
не знаю. в бд запись или есть или ее нет. понятия нулл записи нет. поля есть, а записи нет
Я подозреваю, что это поле какой-то записи, и оно вполне может быть null.

Roman
26.04.2018
07:52:24
а вот не получается так( Option.ofObj - the type does not have null as a proper value
А можно пример кода, где нуллы появляются? А то мы тут зубы по фотографии лечим

Владислав
26.04.2018
07:56:37
А можно пример кода, где нуллы появляются? А то мы тут зубы по фотографии лечим
[<AllowNullLiteral>] type Punch(attack: int, heroId: Guid, dragonId: Guid) = let _id = Guid.NewGuid() let _attack = attack let _heroId = heroId let _dragonId = dragonId interface IEntity with member this.GetId() = _id member this.Id with get() = (this :> IEntity).GetId() member this.HeroId with get() = _heroId member this.DragonId with get() = _dragonId member this.Attack with get() = _attack query { for dragon in unitOfWork.DragonRepository.All do leftOuterJoin punch in unitOfWork.PunchRepository.All on (dragon.Id = punch.DragonId) into _punch for punch in _punch do groupValBy punch dragon into gd select (gd) } |> Seq.toList

groupValBy punch dragon into gd - генерирует seq [null] после left join

Nikolay
26.04.2018
08:06:42
Привет ?

Владислав
26.04.2018
08:09:24
Потому что надо выкинуть все эти билдеры и писать SQL =) Больше нервов останется
а аттрибут это я уже как ках добавил, а писать SQL я буду просто мне нужен InMemory репозиторий сперва

Vladimir
26.04.2018
08:13:51
ясно, ну вот я выкинул как раз из-за группировок. In memory репозиторий для тестов? Может стоит inMemoryBD подключить?

Делаю сейчас обработку сообщений из кафки, может кто уже делал похожий воркфлоу? Пока не вижу простого решения. start processing if < 1 sec processing completed commit else sleep processing completed resume commit

Vasily
26.04.2018
08:37:33
Там время отклика есть?

Vladimir
26.04.2018
08:38:09
где?)

Vasily
26.04.2018
08:38:22
Ну в воркфле

Vladimir
26.04.2018
08:39:07
processing это просто я вызываю функцию по обработке сообщения, она может занять скажем до 10 секунд, а может и несколько миллисекунд, т.к. там запись в базу с ретраями

Vasily
26.04.2018
08:39:34
Ну оперируй фреймами времени

Vladimir
26.04.2018
08:40:41
расшифруй плиз)

Vasily
26.04.2018
08:40:54
Условно у тебя есть кортеж, состоящий из времени и состояния

Google
Vasily
26.04.2018
08:41:15
Дальше ты этот стрим фолдируешь

Как тебе надо

Vladimir
26.04.2018
08:44:18
Сложно) Можешь псевдокод привести?

Vasily
26.04.2018
08:46:29
Ну смотри

Есть счётчик времени

Ты в нем отсчитываешь тики

Vladimir
26.04.2018
08:47:29
в акторе?

Vasily
26.04.2018
08:47:33
Далее у тебя есть статус операции

Завязанный на время

Это все приходит в виде некоего потока

При матчинге можно задать правила обработки

Vladimir
26.04.2018
08:50:23
А, ты про это) Да, если у меня есть статус и сколько времени прошло, то что сделать это понятно. Вопрос главный как их получить

Vladimir
26.04.2018
08:53:30
Надо как-то два потока, один который будет выполнять процессинг, а другой отсчитывать время, и чтобы оба одновременно запустились, потом на каждую нотификацию от обоих сравнивать их результаты

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