Ton*_*son 62 f# functional-programming
从一个选项列表到一个只包含Some的元素的列表,我出乎意料地遇到了一些麻烦.
我最初的尝试是:
let ga = List.filter (fun xx ->
match xx with
| Some(g) -> true
| None -> false) gao
Run Code Online (Sandbox Code Playgroud)
但是,当然,这种结果类型仍然是一个选项列表.我不知道如何使用List.map来压缩它,因为你必须处理匹配语句中的所有情况.我有一个丑陋的解决方案,但我想知道是否有更好的东西.
丑陋:
let rec gOptRemove gdec gacc =
match gdec with
| head :: tail ->
match head with
| Some(a) -> gOptRemove tail (a :: gacc)
| None -> gOptRemove tail gacc
| [] -> gacc
Run Code Online (Sandbox Code Playgroud)
我更愿意找到一个非递归的解决方案或找出这种事情的标准方法.
Bri*_*ian 129
只是
List.choose id
Run Code Online (Sandbox Code Playgroud)
如在
> [Some 4; None; Some 2; None] |> List.choose id;;
val it : int list = [4; 2]
Run Code Online (Sandbox Code Playgroud)