有时候在书中我会看到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.
->上面的第一次使用被弃用了?->似乎不一致.任何人都可以为我调和这个吗?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只->),但在更复杂的情况,你不救,很多人物,我认为语法使用->与->>看起来就有点神秘.