如何在F#中将整数列表转换为这些整数的矩阵

Dab*_*rnl 6 f#

我让我的F#湿透了,很难理解简单的概念.请帮我解决这个问题,而不是做作业!

说我有一个清单 [1;2;3;4]

如何将其转换为列表元素的所有可能组合的列表:

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

我想出了什么:

 let tuples=
    let lst=[1;2;3;4]
    List.map (fun i->(i,i)) lst
Run Code Online (Sandbox Code Playgroud)

显然这会给出错误的结果,但如何继续?我是否只需要使用嵌套for循环方法,我将在C#中编写此代码?

小智 5

您可以使用递归来实现这一点,我相信这被称为"利弊模式"

open NUnit.Framework
open Swensen.Unquote

let convert input =
    let rec loop remain acc =
        match remain with
        | x :: xs -> 
            let combos = xs |> List.map (fun i -> (x,i))
            loop xs (acc@combos)
        | x -> acc

    loop input []

[<Test>]
let TheTest () =
    let actual = convert [1;2;3;4]
    let expected = [(1,2);(1,3);(1,4);(2,3);(2,4);(3,4)]
    test <@ expected = actual @>
Run Code Online (Sandbox Code Playgroud)