【问题标题】:F#: Is there an idiomatic way to replace for loops seq{} expressions? [duplicate]F#:是否有一种惯用的方法来替换 for loops seq{} 表达式? [复制]
【发布时间】:2015-04-14 12:59:20
【问题描述】:

在 F# 中有没有更惯用的方式来表达这种模式:

seq {
    for item1 in list1 do 
        for item2 in list2 do
            yield f(item1,item2)
}

谢谢!

【问题讨论】:

    标签: f#


    【解决方案1】:

    这种模式是惯用的。

    通常另一种选择是使用高阶函数管道,例如 Seq.mapSeq.filter,但对于您的特定情况 - 笛卡尔积 - 序列理解方法真的很出色,否则您将无法获得如此简单的任何东西。

    最终决定使用哪种风格。我倾向于更喜欢流水线方法,只是后来才意识到序列理解方法有多清晰。

    【讨论】:

    • 就像评论一样 - 您需要 Seq.collectSeq.concat(单子方法)来翻译包含多个 for 的内容(应该是大小写,因为在简单的mapfilter 上使用seq { ... } 是没有意义的。
    • @CarstenKönig: true - 如何使用嵌套在Seq.collect 中的Seq.map 实现它的实际示例在链接线程中。至于不使用简单映射/过滤的理解 - 我认为有些人会不同意(我认为 Tomas Petricek 最近写道他更喜欢这种风格)。
    【解决方案2】:

    只要您不需要任何复杂的东西,例如命令式功能或子表达式的扁平化 (yield!),您就可以使用稍微不那么冗长的语法:

    seq { for item1 in list1 do
          for item2 in list2 -> f(item1, item2) }
    

    【讨论】:

    • 压平第二个for的收益率;)
    • 我的意思更像是树遍历,您将子树的展平与产生单个元素结合起来
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多