Select 在F中以功能样式获取集合的组合#

Select 在F中以功能样式获取集合的组合#,select,foreach,f#,functional-programming,Select,Foreach,F#,Functional Programming,假设我们有一个收藏 let xs = ["1";"2"] 我们可以循环它的元素 let forXs = [ for x in xs do yield x ] 或者我们可以使用map let mapXsWithId = List.map id xs let mapXLambda = List.map (fun x -> x) xs 假设我们有许多集合,每个集合的长度可能不同 let xs = ["1";"2"] let ys = ["a";"b";"c"] le

假设我们有一个收藏

let xs = ["1";"2"]
我们可以循环它的元素

let forXs =
    [ for x in xs do
        yield x ]
或者我们可以使用
map

let mapXsWithId = List.map id xs
let mapXLambda = List.map (fun x -> x) xs
假设我们有许多集合,每个集合的长度可能不同

let xs = ["1";"2"]
let ys = ["a";"b";"c"]
let zs = ["1";"2";"3";"4"]
我们可以用这种方法得到所有元素的组合

let combinations =
    [ for x in xs do
        for y in ys do
            for z in zs do
                yield x + y + z ]
我们可以用更实用的方式来做吗?

您可以这样做

let xs = ["1";"2"]
let ys = ["a";"b";"c"]
let zs = ["1";"2";"3";"4"]

let combinations =
    xs
    |> List.collect (fun x ->
        ys
        |> List.collect (fun y ->
            zs
            |> List.map (fun z -> x + y + z)))
问题是这是否比您的解决方案好得多。

您可以这样做

let xs = ["1";"2"]
let ys = ["a";"b";"c"]
let zs = ["1";"2";"3";"4"]

let combinations =
    xs
    |> List.collect (fun x ->
        ys
        |> List.collect (fun y ->
            zs
            |> List.map (fun z -> x + y + z)))

问题是,这是否比您的解决方案好得多。

在@TeaDrivenDev的基础上构建,将集合名称(
xs
)与操作(
列表)放在同一行,使其看起来更等效

let combinations =
    xs |> List.collect (fun x ->
        ys |> List.collect (fun y ->
            zs |> List.map (fun z -> x + y + z)))

let combinations2 =
    [ for x in xs do
        for y in ys do
            for z in zs do
                yield x + y + z ]

在@TeaDrivenDev的基础上,将集合名称(
xs
)与操作(
List.
)放在同一行,使其看起来更加等效

let combinations =
    xs |> List.collect (fun x ->
        ys |> List.collect (fun y ->
            zs |> List.map (fun z -> x + y + z)))

let combinations2 =
    [ for x in xs do
        for y in ys do
            for z in zs do
                yield x + y + z ]

您演示的方式非常实用。你从中看到了什么功能对你来说还不够?有了map,你的合同比for/foreach更严格——你对所有的事情都做了。使用for/foreach,您仍然可以做奇怪的事情。这有点像从转到循环的过程。您放弃了功能,但使代码更具可读性和可预测性,并且更不容易出错。您可以使用
List.collect
执行完全相同的奇怪操作<代码>用于。。in
只是语法上的糖分。我想我对
collect
的理解不太清楚。这听起来像是
List.map
限制到了
List.collect
没有的级别。您演示的方式非常实用。你从中看到了什么功能对你来说还不够?有了map,你的合同比for/foreach更严格——你对所有的事情都做了。使用for/foreach,您仍然可以做奇怪的事情。这有点像从转到循环的过程。您放弃了功能,但使代码更具可读性和可预测性,并且更不容易出错。您可以使用
List.collect
执行完全相同的奇怪操作<代码>用于。。in只是语法上的糖分。我想我对
collect
的理解不太清楚。这听起来像是
List.map
限制到了
List.collect
没有的水平。答案很好。你说的是@TeaDrivenDev,因为…在…中…做…收益率并不是那么必要,它读起来非常好。回答得很好。你说它是@TeaDrivenDev,因为…在…中…做…收益率并不是那么必要,它读起来非常好。