F # - генерация списка кортежей из целочисленного ввода - PullRequest
0 голосов
/ 28 октября 2018

Я должен вернуть список кортежей из целочисленного ввода.Например: 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

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

Ответы [ 2 ]

0 голосов
/ 28 октября 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 ].Это все равно будет более функциональным, чем циклы.

0 голосов
/ 28 октября 2018

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

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

или

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