0

我正在尝试编写一个 F# 类型,它包装了一个基础集合,Map<int64, customType>以便我可以向其中添加项目:

type public CandleContainer (seedCandles:System.Collections.Generic.IEnumerable<Candle>) = 
let candles : Map<int64, Candle> =
    seedCandles
    |> Seq.map (fun x -> x.Start.Ticks, x)
    |> Map.ofSeq

let candleInterval = TimeSpan.FromMinutes(1.0)

member public x.AddCandle (candle:Candle) = 
    candles = candles.Add(candle.Start.Ticks, candle)

member public x.GetList () : List<Candle> = 
    candles
    |> Map.toSeq
    |> Seq.map (fun (key, value) -> value)
    |> Seq.toList

我遇到的问题出在 AddCandle 方法中。我知道 Map.Add 返回一个带有添加值的新地图,编译器并没有抱怨我试图覆盖蜡烛的值。但是,每当我尝试使用此方法添加新蜡烛时,x.GetList 都会返回一个空列表。有没有办法用 Map.Add 的结果覆盖蜡烛的旧值?还是我只是将蜡烛设置为可变值并覆盖它?

4

1 回答 1

2

您正在寻找的是mutable关键字和<-运算符。

改变let candles ...

let mutable candles : Map<int64, Candle>

并且candles = ...成为

candles <- candles.Add(candle.Start.Ticks, candle)

. 另请注意,您之前使用 =您认为发生替换的地方实际上是执行相等检查,使该方法的返回类型bool

于 2013-11-11T23:25:15.683 回答