具有二次复杂度的简单解决方案:
(* [check_pair] should return [false] if check fails *)
let rec check_each_pair check_pair = function
| [] -> true
| hd1 :: rest ->
let rec check_rest = function
| [] -> true
| hd2 :: rest -> check_pair hd1 hd2 && check_rest rest
in
check_rest rest && check_each_pair check_pair rest
请注意,内部check_rest
仅检查列表中每个元素的谓词。那就是List.for_all
。
let rec check_each_pair check_pair = function
| [] -> true
| hd1 :: rest ->
List.for_all (check_pair hd1) rest && check_each_pair check_pair rest
你可以去疯狂组合器,也可以check_each_pair
作为对递归组合器的调用来实现,但这不是直接的(你需要以rest
某种方式累积,所以折叠,但是你想要快捷方式失败早期语义......)我不'看不到任何优势。