F#:如何检查序列内容的顺序?

时间:2019-04-16 10:29:01

标签: f#

我想生成一组元组序列

用于在棋盘游戏(正方形)中生成线的坐标;水平线,垂直线和主要的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)

1 个答案:

答案 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关键字),并且可以将生成嵌套列表的所有代码放在一个大的@块中,并用多个块来避免使用[ .. ]嵌套的foryield。这会使您的代码短一些:

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) ] ]