F#中Option.defaultValue结合failWith异常触发异常问题及替代方案
问题原因与解决方案
为什么无论输入Some还是None都会触发异常?
F#采用严格求值策略,函数的所有参数在传入函数之前都会被完整计算。你写的代码里,Option.defaultValue的第二个参数是failwith "Error"——这个表达式会在Option.defaultValue执行前就被求值,所以不管第一个参数是Some 1还是None,failwith都会先被触发,直接抛出异常。
除match with之外的实现方法
1. 使用Option.value或Option.valueWith(F# 4.7+支持)
这两个是F#标准库提供的专用函数,参数采用惰性求值(仅在需要时计算异常逻辑):
Option.value:输入为None时默认抛出ArgumentExceptionprintf "%A" (Some 1 |> Option.value)Option.valueWith:允许自定义异常信息,仅在None时执行传入的函数printf "%A" (Some 1 |> Option.valueWith (fun () -> failwith "Error"))
2. 自定义惰性求值辅助函数
如果需要兼容旧版本F#,可以自己实现逻辑类似的函数:
let defaultValueLazy (errorFn: unit -> 'a) (opt: 'a option) = match opt with | Some x -> x | None -> errorFn()
使用方式:
printf "%A" (Some 1 |> defaultValueLazy (fun () -> failwith "Error"))
3. 函数式模式匹配简写
用function关键字快速定义处理Option的匿名函数:
let getValue = function Some x -> x | None -> failwith "Error" printf "%A" (getValue (Some 1))
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

