2014-11-15 7 views

ответ

5

Использование List.collect

[(0,0); (1,2); (3,4)] |> List.collect (fun (x,y) -> [x; y]) 

В своем вопросе вы говорите, что хотите получить список в начале, но в конце концов вы говорите последовательности, в любом случае для последовательности сбора также доступна.

Для получения дополнительной информации collect является функцией монадической bind или оператор >>= в некоторых языках (SelectMany в C#), которые для списков/последовательность эквивалентна картой с последующим CONCAT.

2
[(0,0); (1,2); (3,4)] |> List.map(fun (x,y)->[x; y]) |> List.concat 

ie. карта кортеж последовательность в список списков, а затем присоединиться списки вместе

или

[(0,0); (1,2); (3,4)] |> Seq.map(fun (x,y)->seq { yield x; yield y}) |> Seq.concat |> Seq.toList 

Я придумал более длинную версию Seq первой, потому что модуль Seq традиционно больше операторов для работы с. Однако приходят типы F # 4, Seq, List и Array будут иметь полный охват оператора.

6

Другой вариант заключается в использовании выражений последовательности - Я очень нравится этот вариант, но это вопрос личных предпочтений:

[ for a, b in original do 
    yield a 
    yield b ] 
+0

первоначальный список список кортежем 2 ст. Должен ли я иметь скобу вокруг и b, другими словами [для (a, b) в оригинале do дает результат b]? (Я тестировал код, оба способа дали одинаковые результаты) Какой из них правильный и почему?> –

+0

Если они оба работают, и оба они дают одинаковые результаты, то они оба правильны. Parens являются обязательными только в F #, когда их отсутствие приводит к ошибкам двусмысленности и компилятора. –

Смежные вопросы