Как преобразовать x для x в seq в seq

Это дополнительный вопрос к этому SO-post .

Учитывая этот блок кода (csvData1 — это файл .csv.)

let mappedSeq1 = seq { for csvRow in csvData1 do yield (csvRow.[2], csvRow.[5]) }

for x in mappedSeq1 do
    printfn "%A" x

Что, если я не хочу распаковывать каждый элемент последовательности в x и второе значение, которое мы могли бы назвать y. Как я могу преобразовать x в последовательность, чтобы я мог использовать Seq.fst и Seq.snd?

Я знаю, что можно распаковать эти элементы. Мой вопрос заключается в том, чтобы найти альтернативный способ сделать это, особенно учитывая, что x является System.Tuple.


person octopusgrabbus    schedule 14.09.2016    source источник
comment
что такое x? Используете ли вы инструмент разработки с информацией о типе? Например, в Visual Studio вы можете увидеть тип x, наведя на него указатель мыши.   -  person Mark Seemann    schedule 14.09.2016
comment
Да, x — это System.Tuple, но я не могу структурировать код для использования Seq.fst и так далее.   -  person octopusgrabbus    schedule 14.09.2016
comment
Я удалил часть «Что такое x» из ОП. По сути, я хочу вытащить первый или второй элемент из System.Tuple без распаковки. Это более или менее академический запрос. Я просто хочу знать, есть ли другой способ.   -  person octopusgrabbus    schedule 14.09.2016
comment
Вы можете использовать fst и snd вместо деструктурирования...   -  person Mark Seemann    schedule 14.09.2016
comment
Позвоните fst x или snd x. Кортеж не является seq, а fst/snd происходит из модуля Operators. Нет Seq.fst, по крайней мере, такого, который делает то, что вы хотите.   -  person scrwtp    schedule 14.09.2016
comment
Вот и все. Я путаю последовательность с производным от нее кортежем. Спасибо.   -  person octopusgrabbus    schedule 14.09.2016


Ответы (2)


x — это кортеж из двух string (это то, чем, как я предполагаю, являются csvRow.[i]), потому что именно так вы yield извлекаете его из последовательности. И вы можете деструктурировать его прямо в цикле for:

for (x,y) in mappedSeq1 do
   printfn "%s - %s" x y

или вы можете использовать fst x или snd x, если вы не хотите деструктурировать x.

person Fyodor Soikin    schedule 14.09.2016
comment
Я не хочу разрушать x. Из-за отсутствия лучшего способа описать это я хотел бы привести x к Seq, чтобы я мог использовать методы Seq. - person octopusgrabbus; 14.09.2016
comment
Я не совсем понимаю, как вы хотите преобразовать x в Seq. x — это кортеж, а не последовательность, поэтому вы не можете привести его к одному. Вы имели в виду, что хотите создать последовательность с двумя элементами в ней? Тогда вы можете просто составить список [x; y]. Вы имели в виду что-то другое? - person Fyodor Soikin; 14.09.2016

В настоящее время ваш код создает последовательность, которая считывает строки и создает кортежи из столбцов 2 и 5.

Если вы хотите вернуть последовательность Row0Col2; Ряд0Кол5; Строка1Столбец2; Row1Col5 (два столбца должны быть одного типа), затем используйте

yield! [ csvRow.[2], csvRow.[5] ]

Или, если вам нужна последовательность последовательностей - [Row0Col2; Строка0Колонка5]; [Строка1Кол2; Ro1Col5], затем используйте

yield [ csvRow.[2]; csvRow.[5] ]

yield! выдаст каждый отдельный элемент из списков, тогда как yield просто выдаст списки по порядку.

person marklam    schedule 15.09.2016