F# 记录列表表达式

F# record list expressions

您好,我的问题是关于 F# 中的列表表达式。我尝试创建一个将存储在列表中的记录。我希望 Square 记录中的 Point 记录从 1-9 更新。 弄清楚我的意思,就像你写 let example = [1 .. 1 .. 9] 并得到:val example : int list = [1; 2; 3; 4; 5; 6; 7; 8; 9] 一样。在这里,我希望 Square 记录中的 Pointpos = {x=1; y=1} 更改,并得到点数为 x=1; y=1 的所有 9 个正方形 x=9; y=9

type Point = {x : int; y : int}
type Square = {pos : Point; side : int; X : int}  //A square got a position, a side length and a value

let defaultSquare = { pos = {x=1; y=1}; side = 10; X = 0 }

let spelplan = [{defaultSquare with pos = {x=1; y=1}} .. {defaultSquare with pos = {x=9; y=9}}]

上面的代码我试过了,我也试过了

let spelplan = [{defaultSquare with pos = {x=1; y=1}} .. {defaultSquare with pos = {x=1; y=1}} .. {defaultSquare with pos = {x=9; y=9}}]

然后我收到一条错误消息,提示它不支持 + 运算符。

我已经阅读了 this and this

您的代码无法按预期工作的原因是,F# 不知道如何 枚举 您的 Square - 您可以尝试实现 + 之类的,但我只是创建位置(使用所说的 list expressions),然后将它们映射到 Square list:

let fromPos size v x y = 
    { pos = {x=x; y=y}
    ; side = size
    ; X = v 
    }

[for y in 1..9 do for x in 1..9 -> fromPos 10 0 x y]

作为替代方案,您可以这样做

[for y in 1..9 do for x in 1..9 -> (x,y)]
|> List.map (fun (x,y) -> fromPos 10 0 x y)

当然还有

这里唯一有趣的是我产生位置的方式 - 你可以这样概括它:

let positions width height =
    [ for y in 1..height do for x in 1..width -> (x,y) ]

这将生成从 (1,1)(width,height)

(x,y) 元组列表