gpt4 book ai didi

functional-programming - 如何缩短这个 OCaml 代码?

转载 作者:行者123 更新时间:2023-12-02 05:06:33 24 4
gpt4 key购买 nike

我只是想知道如何缩短这些代码,因为我怀疑它太多余了

let get ename doc = 
try Some (StringMap.find ename doc) with Not_found -> None;;

let get_double ename doc =
let element = get ename doc in
match element with
| None -> None
| Some (Double v) -> Some v
| _ -> raise Wrong_bson_type;;

let get_string ename doc =
let element = get ename doc in
match element with
| None -> None
| Some (String v) -> Some v
| _ -> raise Wrong_bson_type;;

let get_doc ename doc =
let element = get ename doc in
match element with
| None -> None
| Some (Document v) -> Some v
| _ -> raise Wrong_bson_type;;

所以,基本上,我有不同类型的值,我将所有这些类型的值放入 map 中。

上面的代码用于从 map 中获取相应类型的值。我所做的是,对于每种类型,我都有一个 get。要获得一种类型的值(value),我必须看到 a)。它是否存在; b).是否确实是该类型,如果不是,则抛出异常。

但是如您所见,上面的代码似乎是多余的。每种类型的 get 之间的唯一区别只是类型本身。

如何缩短这段代码?

最佳答案

你可以这样做:

let get_generic extract ename doc =
let element = get ename doc in
match element with
| None -> None
| Some v -> Some (extract v)

let get_double = get_generic (function Double v -> v | _ -> raise Wrong_bson_type)
let get_string = get_generic (function String v -> v | _ -> raise Wrong_bson_type)
let get_doc = get_generic (function Document v -> v | _ -> raise Wrong_bson_type)

编辑:要删除多余的 raise Wrong_bson_type(但它很难看):

let get_generic extract ename doc = try
let element = get ename doc in
match element with
| None -> None
| Some v -> Some (extract v)
with Match_failure _ -> raise Wrong_bson_type

let get_double = get_generic (fun (Double v) -> v)
let get_string = get_generic (fun (String v) -> v)
let get_doc = get_generic (fun (Document v)-> v)

关于functional-programming - 如何缩短这个 OCaml 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16216120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com