F# - 使用条件元素创建列表

时间:2016-09-29 11:35:33

标签: list f#

考虑这段代码

let a, b, c = ...
let mutable l = [a]

if conditionB then l <- b :: l
if conditionC then l <- c :: l

我觉得这违背了语言原则。这是正确的方式还是我错过了什么?

编辑: 然后只返回l

2 个答案:

答案 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。然后我们定义一个新列表l2l3,其中包含其他元素,具体取决于conditionBconditionC是否成立(如果它们都不成立,我们只需复制引用原始列表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 =