F # - создание списка кортежей из целочисленного ввода

Я должен вернуть список кортежей из целочисленного ввода. Например: output' 4 должен вернуть список кортежей:

[(1, 1);
(2, 1); (2, 2);
(3, 1); (3, 2); (3, 3);
(4, 1); (4, 2); (4, 3); (4, 4)]

На данный момент я получаю

 [(1, 1); (1, 2); (1, 3); (1, 4);
 (2, 1); (2, 2); (2, 3); (2, 4);
 (3, 1);(3, 2); (3, 3); (3, 4);
 (4, 1); (4, 2); (4, 3); (4, 4)]

Что у меня есть до сих пор:

let output' x =
    let ls= [1..x]
    ls |> List.collect (fun x ->[for i in ls -> x,i])    
output' 4

Я не могу понять, как получить необходимый вывод. Любая помощь будет оценена по достоинству.


person Elandir    schedule 28.10.2018    source источник


Ответы (2)


Вы можете добавить фильтр:

...
|> List.filter (fun (a, b) -> a >= b)`

or

let output x =
    [ for i in 1..x do
      for j in 1..i do yield (i,j)
    ]
person AMieres    schedule 28.10.2018

В F# они в основном работают с последовательностями, поэтому вот ленивое решение, основанное на последовательностях:

let output' max =
    let getTuples x = 
        seq { 1 .. x }
        |> Seq.map (fun y -> (x, y))

    seq { 1 .. max }
    |> Seq.map getTuples

Если вам нужны списки, замените seq { 1 .. x } на [ 1 .. x ]. Это все равно будет более функционально, чем циклы.

person psfinaki    schedule 28.10.2018