Вы используете ()
разделители для того, что кажется записью, но записи используют {}
разделители.Измените свою первую трубу на эту:
(fun acc elem ->
{
Ask = acc.Ask + elem.Ask,
Bid = acc.Bid + elem.Bid,
AskVolume = acc.AskVolume + elem.AskVolume,
BidVolume = acc.BidVolume + elem.BidVolume
}
)
Затем также измените вторую трубу, как предложено в ответе Честера Хаска.
РЕДАКТИРОВАТЬ: Нет, подождите.Тот факт, что у вас есть линия let zero = new Candle()
, заставляет меня переосмыслить это.И вы сказали ранее, что Candle
является объектом C #.Тогда в этом случае вы фактически пытаетесь изменить поля только что созданного объекта zero
.В этом случае вам нужен оператор <-
.F # сознательно проводит различие между операторами =
и <-
.Оператор =
означает равенство и также используется в let x = 5
, поскольку значение x
не может измениться и всегда будет равно 5 в остальной части этого кодаблок, поскольку x
не был отмечен mutable
.(Если x
является объектом, объект может видоизменить свои внутренние объекты, но имя x
всегда будет ссылаться на этот объект).Оператор <-
, с другой стороны, используется для назначения.Он выглядит отличным от оператора =
, потому что вы не обещаете, что это значение останется там навсегда.
Итак, сказав, что вам действительно нужно поменять аккумуляторФункция выглядит примерно так:
(fun acc elem ->
acc.Ask <- acc.Ask + elem.Ask,
acc.Bid <- acc.Bid + elem.Bid,
acc.AskVolume <- acc.AskVolume + elem.AskVolume,
acc.BidVolume <- acc.BidVolume + elem.BidVolume
acc
)
Обратите внимание, как я возвращаю acc
, записав его отдельно в последнюю строку.Последнее выражение в функции F # является его возвращаемым значением;ключевое слово return
не требуется.
Тогда ваш второй канал должен передать в функцию:
|> (fun result ->
result.TimeStamp <- time,
result.Ask <- result.Ask / float entries.Count,
result.Bid <- result.Bid / float entries.Count,
result.AskVolume <- result.AskVolume / float entries.Count,
result.BidVolume <- result.BidVolume / float entries.count,
result.Integrity <- entries.Count / expectedCount
)
Обратите внимание, как я преобразовал entries.Count
в float
, потому что я предполагаю, что ваш Ask
и Bid
значения являются числами с плавающей запятой.Если они являются целыми числами, удалите это преобразование float
, но имейте в виду, что F # использует деление integer при делении целых чисел, например, значение 5 / 2
будет равно 2, а не 2,5.Если вы хотите 2,5, вам придется делить поплавки, 5.0 / 2.0
.