【发布时间】:2015-04-14 12:59:20
【问题描述】:
在 F# 中有没有更惯用的方式来表达这种模式:
seq {
for item1 in list1 do
for item2 in list2 do
yield f(item1,item2)
}
谢谢!
【问题讨论】:
标签: f#
在 F# 中有没有更惯用的方式来表达这种模式:
seq {
for item1 in list1 do
for item2 in list2 do
yield f(item1,item2)
}
谢谢!
【问题讨论】:
标签: f#
这种模式是惯用的。
通常另一种选择是使用高阶函数管道,例如 Seq.map 或 Seq.filter,但对于您的特定情况 - 笛卡尔积 -
序列理解方法真的很出色,否则您将无法获得如此简单的任何东西。
最终决定使用哪种风格。我倾向于更喜欢流水线方法,只是后来才意识到序列理解方法有多清晰。
【讨论】:
Seq.collect 或 Seq.concat(单子方法)来翻译包含多个 for 的内容(应该是大小写,因为在简单的map 或filter 上使用seq { ... } 是没有意义的。
Seq.collect 中的Seq.map 实现它的实际示例在链接线程中。至于不使用简单映射/过滤的理解 - 我认为有些人会不同意(我认为 Tomas Petricek 最近写道他更喜欢这种风格)。
只要您不需要任何复杂的东西,例如命令式功能或子表达式的扁平化 (yield!),您就可以使用稍微不那么冗长的语法:
seq { for item1 in list1 do
for item2 in list2 -> f(item1, item2) }
【讨论】:
for的收益率;)