在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
无效?
答案 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#来支持通用计算表达式,我认为目前不可能(并且可能需要一些与类型类似的功能)。