Ocaml 函数使用 List 和 couples

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

我有一项任务要完成,但我遇到了麻烦。这是在 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 只检查下面的一对是否有第一个元素等于它自己。但我需要它来检查列表的每个第一个元素,而不仅仅是下一个元素。

list ocaml
2个回答
3
投票

好吧,你所做的几乎是完美的,除了你忘记了递归调用:

let rec isFunction = function
   | []  -> true (* if the function is empty it's ok, no ? *)
   | (a, _) :: l -> isNotIn a l && isFunction l;;

而且,实际上,您的第一个函数不仅采用一对夫妇的列表,而且采用一个元素

x
并验证
x
不是列表中任何一对的第一个元素。


0
投票

作为附加建议,让我们首先按第一个值对元组列表进行排序。这很容易。

[(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
© www.soinside.com 2019 - 2024. All rights reserved.