【问题标题】:Check for empty space and return a boolean检查空白空间并返回布尔值
【发布时间】:2019-03-14 08:55:53
【问题描述】:

我已经制作了一个包含一些值的列表,我正在尝试找到列表的平均值。有没有更聪明的方法来做到这一点,我如何检查空白空间/列表,像这样 [ 。 ] 并返回布尔值“false”?

let gennemsnit = List.average [0.0; 0.1; 0.3; 0.4; 1.0; 1.1; 1.1; 1.2; 1.5; 2.0]
     if Array.contains then 
         printfn "false"
     else 
         printfn "%f" gennemsnit

【问题讨论】:

  • 您的数据中“空白空间”的定义是什么?值 0.0 是否意味着空白?它不能是 null 值,因为 F# 中的浮点数不允许为空。一旦我们知道您所说的“空白空间”是什么意思,我们就能回答您的问题。
  • 如果有这样的空白[]

标签: list f# boolean


【解决方案1】:

除了使用 dumetrulo 建议的 Option 类型之外,您还可以使用 Result 类型以特定于域的方式描述您的业务错误。例如,您可以定义一个枚举预期错误情况的类型,包括列表为空或您可能拥有的任何其他规则(假设您不想在列表中允许任何负值),然后返回 @ 987654323@ 带有特定的失败案例或Ok 带有值:

type AggregateError =
| ListIsEmpty
| ListContainsNegativeValues

let average = function
| [] -> Error ListIsEmpty
| list when list |> List.exists ((>) 0.0) -> Error ListContainsNegativeValues
| values -> Ok <| List.average values

在这里,如果您对一个空列表运行 average,您会得到 Error ListIsEmpty

average [];;

val it : Result<float,AggregateError> = Error ListIsEmpty

如果您对包含一个或多个负值的列表运行 average,则会得到 Error ListContainsNegativeValues

average [1.0; -1.0];;

val it : Result<float,AggregateError> = Error ListContainsNegativeValues

否则,你会得到Ok的实际平均值:

average [0.0; 1.0; 3.0; 5.0];;

val it : Result<float,AggregateError> = Ok 2.25

【讨论】:

    【解决方案2】:

    如果我理解正确,您想计算浮点数列表的平均值,但在值列表为空的情况下返回没有平均值的指示。那是对的吗?如果是这样,则不能返回平均值或布尔值……但可以返回可选值:

    let average = function
        | [] -> None
        | values -> Some (List.average values)
    
    average [0.0; 0.1; 0.3; 0.4; 1.0; 1.1; 1.1; 1.2; 1.5; 2.0]
    |> printfn "%A"
    
    average []
    |> printfn "%A"
    

    输出:

    "F# Compiler for F# 4.0 (Open Source Edition)
    
    Some 0.87
    <null>
    

    编辑:输出 &lt;null&gt; 是由于编译器优化,将 None 表示为 null

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      相关资源
      最近更新 更多