【发布时间】:2019-02-15 03:22:07
【问题描述】:
仍在使我的代码在样式和外观上越来越实用的过程中。
这里我有一个函数,我尽量保持通用,传递一个过滤函数和一个计算函数作为参数。
let calcError filter (fcalc:'a -> float) (arr:'a array) =
arr |> Array.filter filter
|> Array.map fcalc
|> Array.average
签名是:
val calcError : filter:('a -> bool) -> fcalc:('a -> float) -> arr:'a array -> float
我相信这是相当标准的,在部分应用程序中使用 calcError。
但是 Array.average 会引发异常,如果数组大小为 0 或如果为 null(在我的情况下不会发生)。
我不太喜欢 F# 中的异常,我更喜欢使用(浮点输出)或结果。
然后我会考虑以这种方式编写代码,但我不确定这是在功能性思维方式(我正在尝试获取)内做的正确方式。当然欢迎任何其他解决方案,我可能能够适应其他类似问题。
谢谢大家
我想到的解决方案:
let calcError2 filter (fcalc:'a -> float) (arr:'a array) =
let subarr = arr |> Array.filter filter
match subarr.Length with
| 0 -> Result.Error "array length 0"
| _ -> subarr |> Array.map fcalc
|> Array.average
|> Result.Ok
【问题讨论】:
-
这对我来说看起来不错。我可能会尝试将错误案例的消息更改为更详细的内容(例如“过滤后数组为空”),但我认为很多人不会对您提出的解决方案有疑问。
-
看fsharpforfunandprofit.com/posts/recipe-part2页面的tryCatch函数
-
@BentTranberg 我喜欢 tryCatch 方法。我使用这本圣经研究了 ROP,但没有想到 tryCatch 函数。谢谢!