检查空白空间并返回布尔值

时间:2018-10-09 14:26:06

标签: list f# boolean

我制作了一个列表,其中包含一些值,我试图找到列表的平均值。有没有更聪明的方法可以做到这一点,以及如何像这样[...]检查空白空间/列表? ]并返回布尔值“ 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

2 个答案:

答案 0 :(得分:3)

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

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>

编辑:输出<null>是由于编译器优化而产生的,该优化器将None表示为null

答案 1 :(得分:1)

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

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