【问题标题】:do yield in for loop within sequence computation expression在序列计算表达式中执行 for 循环
【发布时间】:2012-04-29 16:13:43
【问题描述】:

为什么这些工作

let x = seq { for i in 1 .. 10 do yield i }
let x = seq { for i in 1 .. 10 -> i }
let x = seq { for i = 1 to 10 do yield i }

但是这个没有?

let x = seq { for i = 1 to 10 -> i }

【问题讨论】:

    标签: f# sequence


    【解决方案1】:

    根据the F# specification,序列表达式可以是普通的计算表达式(这是您编写do yield的情况),也可以是特定于序列表达式的简短形式:

    seq { comp-expr }
    seq { short-comp-expr }
    

    comp-expr 案例涵盖了您的第一个和最后一个工作示例。短格式使用->,规范明确指出唯一允许的短格式是in关键字:

    short-comp-expr :=
       for pat in expr-or-range-expr -> expr        -- yield result
    

    在实践中还有许多其他的简短形式很有用,但我想目的是为这种非常常见的大小写提供一种特殊的语法,并保持语言统一。

    【讨论】:

    • 该规范的链接不再有效,任何人都可以查看lastest spec6.3.11 Sequence Expression 部分。
    【解决方案2】:

    要为@Tomas 的回答添加更多细节,您的第一个和第三个示例详细说明为:

    let x = Seq.collect (fun i -> {yield i}) {1..10}
    

    而你的第二个例子被翻译成:

    let x = Seq.map (fun i -> i) {1..10}
    

    Section 6.3.11 in the spec 中提到了翻译规则。在该部分中,您还可以看到 F# 统一处理完整的 for 循环(for...in...dofor...to...do),但 -> 的特殊语法仅适用于 for...in... 块。

    没有问题,你可以随时使用for...in...来表达for...to...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-23
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多