创建一个包含从元组列表中提取的数据的列表-类型问题

时间:2019-02-21 14:16:02

标签: ocaml

我的数据按以下顺序排序:

([(x1,y1,z1);(x2,y2,z2);(x3,y3,z3);........;(xn,yn,zn)], e:int)

示例:我尝试创建一个列表[x1;x2;x3;....;xn;e],其中仅一次找到一个值。

我开始以下代码,但是遇到类型问题。

    let rec verifie_doublons_liste i liste = match liste with
        | [] -> false
        | head::tail -> i = head || verifie_doublons_liste i tail

    let rec existence_doublon liste = match liste with
        | [] -> false
        | head::tail -> (verifie_doublons_liste head tail) || 
            existence_doublon tail

    let premier_du_triplet (x,y,z) = x
    let deuxieme_du_triplet (x,y,z) = y
    let troisieme_du_triplet (x,y,z) = z

    let rec extract_donnees l = match l with
        | [] -> []
        | (x,y,z)::r -> (extract_donnees r)@@(x::z::[])


    let arrange donnees = match donnees with
        | [],i -> i::[]
        | (x,y,z)::[],i -> x::z::i::[]
        | (x,y,z)::r,i -> (extract_donnees r)@@(x::z::i::[])

1 个答案:

答案 0 :(得分:0)

基本上,您要提取元组列表中的第一个元素,并在末尾添加元素。

最简单的方法是使用List.map提取第一个元素

List.map premier_du_triplet

是一个函数,它将获取一个三元组列表,并提取每个元组的第一个元素。

然后您可以使用“ @”运算符在末尾添加e元素。

更有效和信息量更大的方法将是直接编写一个递归函数,例如 f ,它可以满足您的需求。

编写递归函数时,您需要问自己两件事

  • 在最简单的情况下它会做什么(在这里f []会做什么?)
  • 当您具有一个head :: tail格式的列表,并且已经可以在尾部使用f时,您应该对head和tail进行什么操作才能获得(f(head :: tail))?

有了这些信息,您应该能够编写一个使用模式匹配来完成您想要的事情的递归函数

最简单的情况是

| [] -> [e]

(您只需在末尾添加e)

一般情况是

| h::t -> (premier_de_triplet h)::(f t)
相关问题