我想生成一组元组序列
用于在棋盘游戏(正方形)中生成线的坐标;水平线,垂直线和主要的2条对角线
我使用列表(使用generateLines函数)创建的一个效果很好。它在元组列表的列表中生成线的坐标。但是,将其转换为序列序列后,我不知道如何检查序列是否正确
我已经尝试过了: CoordinateLines 3 |> Seq.map(有趣的x-> Seq.toList)|> Seq.toList
但是它不起作用,并显示错误:错误FS0030:值限制。值“ it”已推断为具有通用类型
val it:('_a->'_b list)当'_a:> seq <'_ b>
时列出
要么将“ it”定义为一个简单的数据术语,或者使其成为具有显式参数的函数,或者,如果您不希望它泛泛,则添加类型注释。
let CoordinateLines size : seq<seq<int*int>> =
let generateLines size =
[for a in 0..(size-1) do
yield [for b in 0..(size-1) do
yield(a,b)
]
]
@
[for a in 0..(size-1) do
yield [for b in 0..(size-1) do
yield(b,a)
]
]
@
[[for a = 0 to (size-1) do
yield (a,(size-1)-a)
]]
@
[[for a = 0 to (size-1) do
yield (a,a)
]]
generateLines size
|> List.toSeq
|> Seq.map (fun x -> List.toSeq x)
答案 0 :(得分:3)
您收到此错误,是因为您忘记了在传递给x
的lambda函数中传递Seq.toList
作为Seq.map
的参数。以下工作正常:
CoordinateLines 3 |> Seq.map (fun x ->Seq.toList x) |> Seq.toList
或者,您也可以直接将Seq.toList
用作Seq.map
的参数:
CoordinateLines 3 |> Seq.map Seq.toList |> Seq.toList
也就是说,我看不出将列表转换为seq<'a>
的任何原因-列表类型已经实现了seq<'a>
接口,因此您想要对序列进行的任何操作都可以使用列表。而且由于您已经在生成完全评估的列表,因此实际上可能会发现您可以使用列表更好地编写一些后续逻辑。
如果我这样做的话,我只会编写一个返回列表列表的函数。您也可以使用
[ for <var> in <range> -> <expr> ]
表示法(可让您省略一些yield
关键字),并且可以将生成嵌套列表的所有代码放在一个大的@
块中,并用多个块来避免使用[ .. ]
嵌套的for
和yield
。这会使您的代码短一些:
let CoordinateLines size =
[ for a in 0..(size-1) ->
[ for b in 0..(size-1) -> (a,b) ]
for a in 0..(size-1) ->
[ for b in 0..(size-1) -> (b,a) ]
yield [ for a in 0..(size-1) -> (a,(size-1)-a) ]
yield [ for a in 0..(size-1) -> (a,a) ] ]