我有一项任务要完成,但我遇到了麻烦。这是在 ocaml 中,列表是主要焦点。
第一个函数接收一对对 [(a1,b1);(a2,b2)...] 的列表并验证每个“a”是否不同。
我试着分两部分来做:
let rec isNotIn x = function
|[]-> true
|(a,_)::l -> a <> x && isNotIn a l;;
let isFunction = function
|[] -> false
|(a,_)::l -> isNotIn a l;;
我找不到让它工作的方法,isFunction 只检查下面的一对是否有第一个元素等于它自己。但我需要它来检查列表的每个第一个元素,而不仅仅是下一个元素。
好吧,你所做的几乎是完美的,除了你忘记了递归调用:
let rec isFunction = function
| [] -> true (* if the function is empty it's ok, no ? *)
| (a, _) :: l -> isNotIn a l && isFunction l;;
而且,实际上,您的第一个函数不仅采用一对夫妇的列表,而且采用一个元素
x
并验证x
不是列表中任何一对的第一个元素。
作为附加建议,让我们首先按第一个值对元组列表进行排序。这很容易。
[(3, 4); (5, 7); (1, 2); (3, 7)]
|> List.sort (fun a b -> compare (fst a) (fst b))
我们得到:
[(1, 2); (3, 4); (3, 7); (5, 7)]
确定第一个元素中是否有重复变得容易得多,因为如果它们存在,它们将是相邻的。我们可以轻松地对列表中的前两个元素进行模式匹配,并检查对两者应用一个函数是否会产生相同的结果。
let rec has_dupes f = function
| [] | [_] -> false
| a::b::_ when f a = f b -> true
| _::rest -> has_dupes f rest
现在:
# [(3, 4); (5, 7); (1, 2); (3, 7)]
|> List.sort (fun a b -> compare (fst a) (fst b))
|> has_dupes fst;;
- : bool = true