首页 > 解决方案 > F#中for循环中的'->'和'do'有什么区别

问题描述

我可以做这个:

[ for i in 0 .. 5 -> i ]

或者

[ for i in 0 .. 5 do i ]

但是,虽然我可以这样做:

[ for i in 0 .. 5 do yield! [i * 4; i] ]

我不能这样做:

[ for i in 0 .. 5 -> yield! [i * 4; i] ]

这是为什么?两者如何区别对待?

标签: f#

解决方案


这是相当棘手的,因为这里有一些 F# 隐式执行的操作。

首先,->语法实际上只是 的快捷方式do yield,因此以下翻译为:

  [ for i in 0 .. 5 -> i ] 
= [ for i in 0 .. 5 do yield i ]

这解释了为什么你不能这样做-> yield!,因为翻译会导致:

  [ for i in 0 .. 5 -> yield! [i * 4; i] ]
= [ for i in 0 .. 5 do yield (yield! [i * 4; i]) ]

你会yield!嵌套在里面yield,这是没有意义的。

第二个棘手的问题是 just 的语法do。这是 F# 中最近的一个变化,它使编写列表生成器变得更容易(这对于构造诸如 HTML 树之类的特定领域的语言来说非常棒)——编译器隐式插入yield,因此代码翻译为:

  [ for i in 0 .. 5 do i ]
= [ for i in 0 .. 5 do yield i ]

有趣的是,这也适用于多个产量:

  [ for i in 0 .. 5 do 
      i
      i*10 ]

= [ for i in 0 .. 5 do 
      yield i 
      yield i*10 ]

->这是和之间的另一个区别do。使用->,您只能产生一件事。使用do,你可以产生多个东西。

我想现在使用的理由很少->。这是在隐式之前的语言中yield,因此它在早期版本的 F# 中很有用。do当事情变得如此简单时,您可能不再需要它了。


推荐阅读