List 更新列表元素的问题

List 更新列表元素的问题,list,data-structures,f#,task-parallel-library,List,Data Structures,F#,Task Parallel Library,下面的函数旨在通过更新块中列表的元素来添加并行性,以尝试对其进行负载平衡。但是,它的giving me:property“item”不能设置为内部循环中的xs.[x1]。我必须使用一个列表,因为该函数的列表是一个更大算法的一部分。有什么建议吗 let pmap_tpl_parforlb f (xs:list<_>) = let chunkLength = xs.Length / numProc Parallel.For(0,numProc, fun c ->

下面的函数旨在通过更新块中列表的元素来添加并行性,以尝试对其进行负载平衡。但是,它的giving me:property“item”不能设置为内部循环中的xs.[x1]。我必须使用一个列表,因为该函数的列表是一个更大算法的一部分。有什么建议吗

let pmap_tpl_parforlb f (xs:list<_>) =
    let chunkLength = xs.Length / numProc 
    Parallel.For(0,numProc, fun c ->    
        let x = c * chunkLength
        let y = (c * chunkLength) + chunkLength
        let x1 = x+1
        for x1 in 0..y-1 do
            xs.[x1] <- f (xs.[x1])
    ) |> ignore
    xs
让pmap_tpl_parforlb f(xs:list)=
让chunkLength=xs.Length/numProc
平行。对于(0,numProc,fun c->
设x=c*chunkLength
设y=(c*chunkLength)+chunkLength
设x1=x+1
对于0..y-1 do中的x1
xs.[x1]忽略
xs
  • xs.Length/numProc正在向下舍入(这样会丢失元素,例如1/8=0)
  • 最后一个区块的长度可能不是
    chunkLength
    ,而是更短。您必须协调这一事实
  • x1不应该从0开始,而不是从1开始吗
  • 无论如何,使用调试器检查变量的运行时值,您会发现所有错误。

    内置的F#list类型是不可变的,这就是为什么会出现该错误。您可以使用索引符号(
    blah.[idx]
    )访问列表值,但它非常罕见,而且速度也很慢,因为它是一个O(n)操作


    从您发布的代码片段来看,似乎您应该将
    xs
    设置为数组而不是列表。或者,使用
    list.toArray
    array.ofList
    将列表转换为数组,然后在
    并行中对其进行变异。对于

    ,如果代码未编译,他将无法使用调试器。他正在获得一个er来自编译器的ror消息,而不是运行时的异常。实际上,整个示例看起来像是PLINQ的合适任务…:)