为什么在F#理解中不推荐使用" - >"?

roy*_*yco 7 f#

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

seq { for i = 0 to System.Int32.MaxValue -> i }
Run Code Online (Sandbox Code Playgroud)

这是来自Chris Smith的编程F#,第80页.在VS2010附带的F#中,这不能编译.我相信->已被弃用.(参见备选列表理解语法).但是,->仍然可以用于涉及范围的理解:

seq { for c in 'A' .. 'Z' -> c }
Run Code Online (Sandbox Code Playgroud)

根据专家F#2.0,第58页,这是因为超过范围的->简写Seq.map.

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

Tom*_*cek 10

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

seq { for <binding> in <input> -> <projection> }
Run Code Online (Sandbox Code Playgroud)

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

seq { for i in 0 .. System.Int32.MaxValue -> i }
Run Code Online (Sandbox Code Playgroud)

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

seq { -> 10              // You need 'yield' here
      ->> [ 1; 2; 3 ] }  // You need 'yield!' here
Run Code Online (Sandbox Code Playgroud)

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

"简单"特定序列的语法仍然是有用的,因为它可以节省您的一些打字(更换do yield->),但在更复杂的情况,你不救,很多人物,我认为语法使用->->>看起来就有点神秘.