多态默认函数参数

问题描述 投票:0回答:1

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

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

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

types polymorphism ocaml optional-parameters
1个回答
0
投票

这里是您可以为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以外的任何类型。如果我的回答没有回答您的问题,您能否再举一个例子说明您要完成的工作?

© www.soinside.com 2019 - 2024. All rights reserved.