有时在书中我会在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
的简写。
->
已被弃用?->
似乎不一致。任何人都可以为我调和这个吗?答案 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;的语法->>
看起来有些神秘。