F# 完全迷失在按顺序变异属性的尝试中
我完全搞不懂为什么这段代码不按类型序列变异成员变量:F# 完全迷失在按顺序变异属性的尝试中,f#,seq,imperative,F#,Seq,Imperative,我完全搞不懂为什么这段代码不按类型序列变异成员变量: for p in prescrs do p.ATC <- "A" for c in p.Drug.Components do for s in c.Substances do s.DoseTotal.Adjust <- adjustKg s.DoseTotal.Time <- "DAY" s.Dos
for p in prescrs do
p.ATC <- "A"
for c in p.Drug.Components do
for s in c.Substances do
s.DoseTotal.Adjust <- adjustKg
s.DoseTotal.Time <- "DAY"
s.DoseTotal.Unit <- s.DrugConcentration.Unit
s.DoseRate.Adjust <- adjustKg
s.DoseRate.Time <- "DAY"
s.DoseRate.Unit <- s.DrugConcentration.Unit
然后执行命令式循环,属性确实会发生变化。尝试以下示例:
type Mutable() =
member val Iterated = false with get, set
let muts = Seq.init 5 (fun _ -> printfn "init"; Mutable())
let muts2 = muts // try again with let muts2 = muts |> List.ofSeq
printfn "Before iter"
for a in muts2 do
printfn "iter"
a.Iterated <- true
printfn "After iter"
muts2 |> List.ofSeq
type Mutable()=
成员val Iterated=false,带get,set
让muts=Seq.init 5(乐趣->printfn“init”;Mutable())
让muts2=muts//使用let muts2=muts |>List.ofSeq重试
打印fn“国际热核实验堆之前”
为了一个共同的目标
打印fn“国际热核实验堆”
a、 迭代链表
并检查iter
和init
是如何交错的
seq
是惰性的,但一经计算就不会被缓存。因此,即使您强制尝试对prescrs
序列中的某些元素进行变异,一旦您再次拉动prescrs
,所有这些元素都会消失。如果在执行变异之前将prescrs
更改为具体的集合类型,如列表,则不再遇到相同的问题。请注意,如果您拥有的是一个seq中的一个seq中的一个seq,那么事情可能会变得更加棘手
最好的办法是首先避免突变。什么叫“这不起作用”?如何生成
PRESCR
?(顺便说一句,让prescrs=prescrs |>Seq.toList是一种转换,而不是强制转换。)@ildjarn带有“不起作用”我的意思是,属性没有改变。在第二个示例中,属性确实发生了变化。这两个例子都是一个序列的迭代,所以我期望有相同的行为。但是你怎么知道值没有改变呢?也许你的测试有缺陷。。。那么,PRESCR
是如何产生的呢?当您没有为相关上下文显示足够的代码时,您希望如何获得帮助?@ildjarn看到下面的答案,我现在很高兴,感谢您对此进行研究。谢谢,解释得很好,明白了。
let prescrs = prescrs |> Seq.toList
type Mutable() =
member val Iterated = false with get, set
let muts = Seq.init 5 (fun _ -> printfn "init"; Mutable())
let muts2 = muts // try again with let muts2 = muts |> List.ofSeq
printfn "Before iter"
for a in muts2 do
printfn "iter"
a.Iterated <- true
printfn "After iter"
muts2 |> List.ofSeq