我将从简单的例子开始:
let find2 f g x =
let rec _find2 = function
| h::t -> if f h && g h then h else _find2 t
| [] -> raise Not_found
in
_find2
;;
let find = find2 (fun _ -> true);;
find
的类型为
('_a -> bool) -> '_b -> '_a list -> '_a
所以这不是多态代码,正如我想要的那样。 我读了它,我知道它为什么会发生,但我不知道如何解决它而不重复代码。这甚至可能吗?
答案 0 :(得分:1)
要避免遇到所谓的“值限制”,您需要做的就是确保声明语法定义一个函数。在大多数情况下,您可以通过显式创建一个参数来轻松完成此操作,如下所示:
let find g = find2 (fun _ -> true) g