【问题标题】:F# - create list with conditional elementsF# - 创建带有条件元素的列表
【发布时间】:2016-09-29 11:35:33
【问题描述】:

考虑这段代码

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

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

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

编辑: l 然后只是作为结果返回

【问题讨论】:

  • 您应该添加一些关于何时/何时/如何使用 l 的上下文
  • 如果您要问 codereview 问题,请在 codereview 上提问
  • 我不知道这样的堆栈存在。
  • 好吧,你可能有充分的理由这样写。但通常你应该尽量避免返回 unit(),并改变列表。例如,您可以编写一个函数,该函数接受一个项目和一个列表并返回一个新列表。

标签: list f#


【解决方案1】:

序列表达式 (https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/sequences) 非常实用。

[ 
    if conditionC then yield c
    if conditionB then yield b
    yield a
]

【讨论】:

    【解决方案2】:

    如果没有在更大的上下文中查看代码,很难说 - 但仅考虑到这个 sn-p,您可以通过定义具有不同名称的列表的新版本来避免使用突变:

    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# 还有一个名为 variable shadowing 的功能,它可以让您重复使用相同的名称并隐藏原始值,因此您实际上可以为您的列表重复使用相同的名称 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 =

    【讨论】:

    • 一个并发症 - 你可以同时满足两个条件
    猜你喜欢
    • 2016-04-11
    • 2016-11-10
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 2022-12-18
    • 1970-01-01
    相关资源
    最近更新 更多