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