是否有一种方法可以避免重写以下函数以将其应用于多种类型?
在此示例中,我是否可以通过编写可选功能f_comp
来避免编写两个功能的必要性?
示例:
module M = Map.Make (String)
module S = Set.Make (String)
let m = M.add "a" (S.of_list ["a"; "b"]) M.empty
|> M.add "b" (S.of_list ["a"])
let h_highest_degree ?(f_comp=(>)) a b g : bool =
f_comp (S.cardinal (M.find a g)) (S.cardinal (M.find b g))
(* Can I avoid need to define this function? *)
let h_highest_degree_f ?(f_comp=(>)) a b g =
f_comp (float_of_int (S.cardinal (M.find a g)))
(float_of_int (S.cardinal (M.find b g)))
(* e.g *)
h_highest_degree "a" "b" m
除了默认功能外,它们似乎都具有相同的类型签名。
答案 0 :(得分:1)
这是您可以为h_highest_degree_f
给出的替代定义,该定义的重复程度不及h_highest_degree
的定义:
let h_highest_degree_f ?(f_comp=(>)) a b g =
h_highest_degree a b g
~f_comp:(fun x y -> f_comp (float_of_int x) (float_of_int y))
(* h_highest_degree_f : ?f_comp:(float -> float -> bool) -> string -> string -> S.t M.t -> bool *)
不过,我不太确定这是否是您要的内容。您说您正在寻找一种方法来“避免重写以下类似功能以应用于多种类型”。但是程序中没有用于多种类型的函数。 f_comp
中的h_highest_degree
具有类型int -> int -> bool
(因为S.cardinal (M.find a g)
和S.cardinal (M.find b g)
都具有类型int
,并且该函数的返回类型是显式的注释为类型bool
)。由于S.cardinal (M.find a g)
和S.cardinal (M.find b g)
被硬连接到您对h_highest_degree
的定义中,所以我不确定f_comp
除了int -> int -> bool
以外的任何类型。如果我的回答没有回答您的问题,您能否再举一个例子说明您要实现的目标?