使用1个项目创建序列的最佳方法

cit*_*kid 4 f# sequence

在F#中,我可以创建一个1项的序列

seq [42]          // inefficient, since a list is created
seq { yield 42}   // verbose, would prefer { 42 } or seq { 42 }
seq { 42 .. 42 }  // bizarre
Run Code Online (Sandbox Code Playgroud)

虽然我觉得这有点奇怪,但我很好奇是否有人知道一种简短而有效的方法.或者:为什么

{ 42 }  // invalid syntax. in other words, not a valid sequence expression
Run Code Online (Sandbox Code Playgroud)

无效?

Sim*_*son 11

你可以使用:

Seq.singleton 42
Run Code Online (Sandbox Code Playgroud)


Mis*_*hor 7

如果您需要一个真正的序列(即IEnumerable其项目是懒惰地创建),seq { yield <expr> }则可能是最简洁的语法.

如果您不需要仅在消耗时评估该项目(急切的评估很好),那么您可以使用该Seq.singleton功能.

如果你只需要实现的东西IEnumerable,你可以通过使用列表或数组构造函数来实现更短的语法:[ <expr> ]或者[| <expr> |],区别在于数组构造函数在这种情况下可能更有效.

{ <expr> }语法将不会工作,因为没有这样的特殊语法创建的序列(如,例如,一个发电机表达在Python).这seq { yield <stuff> }是一个计算表达式,它必须遵循几个规则,其中之一是它必须说明它定义了什么样的计算(seq部分说明).如果你想省略该seq部分,你需要F#来支持通用计算表达式,我认为这是当前不可能的(并且可能需要一些与类型类似的功能).