一种从两个数组创建元组的更实用的方法

Aag*_*age 2 f# functional-programming

我已经创建了一个会从所有的整数函数1n,然后用相同的序列结合创建所有组合的元组序列。因此,将其传递给整数2将为您提供[(1,1);(1,2);(2,1);(2,2)]

let allTuplesUntil x =
    let primary = seq { 1 .. x }
    let secondary = seq { 1 .. x }
    [for x in primary do
     for y in secondary do
     yield (x,y)]
Run Code Online (Sandbox Code Playgroud)

此实现有效,但它使用了内部和外部for循环,类似于我将在中执行的操作c#

是否可以通过更惯用的功能来实现?由于功能性的简洁性和清晰度,通常会更希望使用功能性更强的方法,还是在功能性语言中可以接受?

我是新手f#,正在寻找反馈。

Dev*_*ewb 5

这些循环是所谓的计算表达式的一部分,对于F#来说这是很惯用的。它只是看起来像熟悉的循环。我看不到用这种方式编写的代码有任何问题。如果要摆脱循环,可以将它们隐藏在函数中:

let cartesianProduct xs ys = 
     xs |> Seq.collect (fun x -> ys |> Seq.map (fun y -> x, y))

cartesianProduct [1;2;3] ['a';'b';'c']

val it : seq<int * char> = seq [(1, 'a'); (1, 'b'); (1, 'c'); (2, 'a'); ...]
Run Code Online (Sandbox Code Playgroud)