gpt4 book ai didi

arrays - 在 F# 中,如何正确使用 ResizeArray() 和 Array.map 中的累加器来更改记录的属性

转载 作者:行者123 更新时间:2023-12-04 15:05:56 24 4
gpt4 key购买 nike

(新手问题)。简单的问题。

在 C# 中,我有以下代码:

double openspace = (WorkArea.Width - totalcolumnwidth) / (ColumnCount - 1);

double left = WorkArea.Left;

for (int k = 0; k < ColumnCount; k++)
{
Cursor cursor = new Cursor
{
TopLeft = new Point(left, WorkArea.Top),
};
cursors.Add(cursor);
left += Columns[k] + openspace;
}

在 F# 中,为了简单起见,我试过这个但失败了。

type Cursor = { TopLeft: float }

let columnCount = 5.0 // // columnCount number of cursors in List<Cursor>

let cursors = new ResizeArray<Cursor>(columnCount)

let mutable left = 20.0

cursors |> Array.map ( fun k -> left <- left + 10 + k.TopLeft ; {k with TopLeft = left} )

此处的目标是根据“left”中的累加器为游标数组中的每个游标计算一个新的 TopLeft 值,并返回一个新的游标数组,每个游标记录都有其新值。

这是如何正确完成的?可以不使用可变的“左”变量来完成吗?

提前谢谢你。

#附录:“列”被定义为一个整数数组(每个整数代表一列的宽度)。

 columns = [|210; 330|]

最佳答案

我认为您不需要折叠(或者更准确地说,一个 scan )来处理这个问题,因为当前的 TopLeft 值实际上可以在不引用之前的值的情况下计算出来TopLeft 值。这是数组理解的一个很好的例子。像这样:

    let cursors =
[|
for i = 0 to columnCount-1 do
yield { TopLeft = initialOffset + (columnOffset * float i) }
|]

之所以可行,是因为列的宽度是恒定的。对于可变宽度的列,您肯定需要扫描,如下所示:

let columnWidths = [| 210; 340; 200; 300 |]
let initialOffset = 100 // left coord of first column
let columnOffset = 20 // gap between columns
let columnLefts =
(initialOffset, columnWidths)
||> Seq.scan (fun acc width ->
acc + width + columnOffset)
|> Seq.take columnWidths.Length // ignore final value
|> Seq.toArray
printfn "%A" columnLefts

输出为:100,330,690,910

关于arrays - 在 F# 中,如何正确使用 ResizeArray() 和 Array.map 中的累加器来更改记录的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66113960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com