为什么是“ - >”在F#理解中弃用了吗?

时间:2010-11-06 05:19:50

标签: f#

有时在书中我会在F#中看到列表和序列理解的这种语法:

seq { for i = 0 to System.Int32.MaxValue -> i }

这是来自Programming F# by Chris Smith,第80页。在VS2010附带的F#中,这不能编译。我相信->已被弃用。 (见Alternative List Comprehension Syntax)。但是,->仍可用于涉及范围的理解:

seq { for c in 'A' .. 'Z' -> c }

根据Expert F# 2.0,第58页,这是因为->是范围内Seq.map的简写。

  1. 为什么上面首次使用->已被弃用?
  2. 当前使用->似乎不一致。任何人都可以为我调和这个吗?

1 个答案:

答案 0 :(得分:10)

仅在“简单”序列表达式语法中支持->构造,您使用以下结构对某些数据源进行投影(Seq.map):

seq { for <binding> in <input> -> <projection> }

你提到的第一个例子是使用for .. to ..,这是一个与for .. in不同的语法结构,但你可以使用第二个重写它(事实上,我几乎总是使用for .. in在编写序列表达式时):

seq { for i in 0 .. System.Int32.MaxValue -> i }

在所有其他形式的序列表达式中,您必须使用yield。在早期版本的F#中,->语法等同于yield(并且还有->>等同于yield!)。例如,您可以写:

seq { -> 10              // You need 'yield' here
      ->> [ 1; 2; 3 ] }  // You need 'yield!' here

这种语法看起来很奇怪,所以我认为不推荐使用这两种语言的主要原因是保持语言的一致性。相同的计算表达式语法用于序列表达式(其中->有一定意义),但也用于其他计算类型(并且您可以定义自己的),其中yield感觉更合适(并且它也对应于异步工作流或其他计算表达式中的return)。

“简单”特定于序列的语法仍然有用,因为它可以节省一些输入(只用do yield替换->),但在更复杂的情况下,你不保存很多字符,我认为使用->&amp;的语法->>看起来有些神秘。