Aag*_*age 2 f# functional-programming
我已经创建了一个会从所有的整数函数1来n,然后用相同的序列结合创建所有组合的元组序列。因此,将其传递给整数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#,正在寻找反馈。
这些循环是所谓的计算表达式的一部分,对于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)