F #: Как проверить последовательность последовательностей содержимого? - PullRequest
1 голос
/ 16 апреля 2019

Я хотел бы сгенерировать последовательность последовательностей наборов кортежей

Он предназначен для генерации координат линий в настольной игре (квадраты), горизонтальных линий, вертикальных линий и основных 2 диагональных линий

Тот, который я создал, используя список (используя функцию generateLines), работает хорошо.Он генерирует координаты строк в списке списков кортежей.Тем не менее, после того, как я преобразовал его в последовательность последовательностей, я понятия не имею, как проверить, является ли он правильным

. Я попробовал это: CoordinateLines 3 |> Seq.map (fun 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 Ответ

3 голосов
/ 16 апреля 2019

Вы получаете эту ошибку, потому что вы забыли передать x в качестве аргумента 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 s и yield s. Это делает ваш код немного короче:

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) ] ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...