
Владислав
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 {} ]

Владислав
23.04.2018
09:19:51
спасибо

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 подойдет или есть аналоги?

Pavel
24.04.2018
15:35:26

Mikhail
24.04.2018
15:37:49
В частности, интересует аналог 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
это как так? Используете рекорды, но возможны нуллы

Pavel
25.04.2018
12:25:47

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

Klei
26.04.2018
07:33:22

Roman
26.04.2018
07:46:22
Или я неправ?

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

Pavel
26.04.2018
07:47:07

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

Klei
26.04.2018
07:47:47

Google

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

Vlad
26.04.2018
07:49:25

Roman
26.04.2018
07:49:30

Klei
26.04.2018
07:50:59

Roman
26.04.2018
07:52:24

Владислав
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
Привет ?

Vladimir
26.04.2018
08:08:27

Владислав
26.04.2018
08:09:24

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
А, ты про это) Да, если у меня есть статус и сколько времени прошло, то что сделать это понятно. Вопрос главный как их получить

Vasily
26.04.2018
08:50:52

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