12

为什么这些工作

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 }
4

2 回答 2

13

根据F# 规范,序列表达式可以是普通的计算表达式(这是您编写的情况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

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

于 2012-04-18T10:25:13.540 回答
4

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

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

而您的第二个示例被翻译为:

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

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

没有问题,因为您始终可以使用for...in...来表达for...to...

于 2012-04-18T11:05:12.903 回答