问题 在序列计算表达式中产生for循环


为什么这些工作

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 }

5966
2018-04-18 09:06


起源



答案:


根据 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

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


12
2018-04-18 10:25



规范的链接不再有效,任何人都可以查看 最新规范, 部分 6.3.11 Sequence Expression。 - Ta Thanh Dinh


答案:


根据 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

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


12
2018-04-18 10:25



规范的链接不再有效,任何人都可以查看 最新规范, 部分 6.3.11 Sequence Expression。 - Ta Thanh Dinh


要向@ 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...do 和 for...to...do)统一,但特殊的语法 -> 适用于 for...in... 只阻止。

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


4
2018-04-18 11:05