Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 完全迷失在按顺序变异属性的尝试中_F#_Seq_Imperative - Fatal编程技术网

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