Ocaml 检查列表中的元素

Ocaml 检查列表中的元素,ocaml,Ocaml,我举一个例子: let l = [0;1;2] let l1 = [0;2] 从列表l检查l的某些元素是否属于l1;如果是,则返回一个配对列表,例如[(1,0);(1;2)]您到底想做什么? 计算l1中l中每个元素的出现次数 一个想法可能是问你自己,我如何为l的一个元素做到这一点? 为此,您可能希望创建一个具有以下签名的函数:nb\u mem:'a->'a list->int 然后,为了生成列表,您可以递归地进行 let rec check l l1 = match l with |

我举一个例子:

let l  = [0;1;2]
let l1 = [0;2]

从列表
l
检查
l
的某些元素是否属于
l1
;如果是,则返回一个配对列表,例如
[(1,0);(1;2)]

您到底想做什么? 计算
l1
l
中每个元素的出现次数

一个想法可能是问你自己,我如何为
l
的一个元素做到这一点? 为此,您可能希望创建一个具有以下签名的函数:
nb\u mem:'a->'a list->int

然后,为了生成列表,您可以递归地进行

let rec check l l1 =
  match l with
  | []     -> []
  | e :: r -> let nb = nb_mem e l1 in
              if nb = 0 then check r l1 else (nb,e) :: (check r l1)
当然,这并没有考虑到一个元素可能会在
l
中多次出现,这远远不是最优的

一个想法可能是在开始之前对两个列表进行排序(如果您使用的是整数值,这很容易),以避免完全多次读取
l1


您还可以使用包含
l1
中每个元素的出现次数的
hashtbl
,然后通过读取
l
中每个元素的相应条目来生成列表。为此,您应该遍历l中的每个元素。然后检查l的第一个元素是否是l1的元素。如果是,则过滤掉所有相等的元素。然后获取相等元素列表的长度,它将是元组中进入返回列表的第一个字符

let check_list l l1 =
  let rec check l l1 combined = 
    match l with
    |[] -> combined
    |(h::t) -> if (List.mem h l1) then 
        check t l1 ((List.length(List.filter (fun x -> h=x) l1),h)::combined)
            else check t l1 combined
in check l l1 []