考虑这段代码
let a, b, c = ...
let mutable l = [a]
if conditionB then l <- b :: l
if conditionC then l <- c :: l
我觉得这违背了语言原则。这是正确的方式还是我错过了什么?
编辑:
然后只返回l
答案 0 :(得分:7)
序列表达式(https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/sequences)非常适用于此目的。
[
if conditionC then yield c
if conditionB then yield b
yield a
]
答案 1 :(得分:3)
很难说没有在更大的上下文中看到代码 - 但是只给出这个代码片段,您可以通过使用不同的名称定义新版本的列表来避免使用变异:
let a, b, c = ...
let l1 = [a]
let l2 = if conditionB then b :: l1 else l1
let l3 = if conditionC then c :: l2 else l2
在这里,我们首先定义l1
,其中只包含元素a
。然后我们定义一个新列表l2
和l3
,其中包含其他元素,具体取决于conditionB
或conditionC
是否成立(如果它们都不成立,我们只需复制引用原始列表l1
两次)。
F#还有一个名为变量阴影的功能,它允许您重复使用相同的名称并隐藏原始值,因此您实际上可以为列表重用相同的名称l
- 以下表示与上述代码完全相同:
let a, b, c = ...
let l = [a]
let l = if conditionB then b :: l else l
let l = if conditionC then c :: l else l
如果您只想将最终列表作为结果返回,则可以删除最后一个let l =
。