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

时间:2014-02-24 11:31:56

标签: 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

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

{ 42 }  // invalid syntax. in other words, not a valid sequence expression

无效?

2 个答案:

答案 0 :(得分:10)

您可以使用:

Seq.singleton 42

答案 1 :(得分:7)

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

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

如果您只需要实现IEnumerable的内容,则可以使用列表或数组构造函数来实现更短的语法:[ <expr> ][| <expr> |],不同之处在于数组构造函数将是在这种情况下可能更有效率。

{ <expr> }语法不起作用,因为没有用于创建序列的特殊语法(例如,Python中的generator expression)。 seq { yield <stuff> }computation expression,它必须遵循几条规则,其中之一是它必须说明它定义了哪种计算(seq部分说明)。如果你想省略seq部分,你需要F#来支持通用计算表达式,我认为目前不可能(并且可能需要一些与类型类似的功能)。