多态默认函数参数

时间:2019-12-21 21:28:18

标签: types polymorphism ocaml optional-parameters

是否有一种方法可以避免重写以下函数以将其应用于多种类型?

在此示例中,我是否可以通过编写可选功能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

除了默认功能外,它们似乎都具有相同的类型签名。

1 个答案:

答案 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以外的任何类型。如果我的回答没有回答您的问题,您能否再举一个例子说明您要实现的目标?