2017-02-09 3 views
1

Ich bin neu zu Ocaml neugierig, wie man eine Funktion namens Seperate_by schreibt, die in zwei Parameter, eine Liste und eine Liste von Elementen auf wo um die ursprüngliche Liste zu teilen.Geteilte Liste in Liste der Listen mit einer Liste als Parameter für wo Ocaml zu spalten

Zum Beispiel

Seperate_by [1;2;3;4;5;6;7] [3;5] 

Sollte eine Leistung von [[1;2];[4];[6;7]]

Vielen Dank im Voraus haben!

+0

Sie nah waren! Aber es ist der Tilde-Schlüssel (der verschnörkelte Schlüssel), um Inline-Code-Formatierung einfach nur zu machen. –

+0

Nur nebenbei, Funktionsnamen können in OCaml nicht groß geschrieben werden :) –

+2

Was haben Sie versucht, und was scheint das Problem damit zu sein? –

Antwort

0

Sie können dies versuchen:

let seperate_by l lsep = 
    let add acc res = if acc<>[] then acc::res else res in 
    let(res,acc)= 
    List.fold_right (fun x (res,acc) -> 
     if List.exists ((=)x) lsep then (add acc res,[]) else (res,x::acc) 
    ) l ([],[]) 
    in 
    add acc res 

Test:

# seperate_by [1;2;3;4;5;6;7] [3;5];; 
- : int list list = [[1; 2]; [4]; [6; 7]] 
# seperate_by [1;2;3;4;5;6;7] [3;5;7];; 
- : int list list = [[1; 2]; [4]; [6]] 
# seperate_by [1;2;3;4;5;6;7] [1;5;7];; 
- : int list list = [[2; 3; 4]; [6]] 
0
let rec seperate_by l sign= 

    let rec aux2 = function 
    (head,[])->(head,[]) 
    |(head,x::r) -> if List.exists ((=) x) sign then (head,r) 
    else aux2 ([email protected][x],r) 
    in 

    let res = aux2 ([],l) in 
    match res with 
    |(head,[])->head::[] 
    |(sub_list,rest_list) -> (sub_list)::(split rest_list sign) 
     ;; 

(* die Funktion Aux2 den ersten SUB_LIST einer Liste zurück, so halte Gebäude i die Liste mit dem Rest der Liste und die schließlich haben wir das Ergebnis *)

Hinweis: Ich sah, dass Ihr Der Name der Funktion beginnt mit einem Großbuchstaben.Alle Variable beginnt mit Großbuchstaben bedeutet "Typ" in Ocaml, also sollte der Name einer Funktion in Kleinbuchstaben beginnen, ist das Ihr Problem?

+0

Super! Weißt du, ob es eine Möglichkeit gibt, List.fold_left anstelle von Rekursion zu verwenden? –

+0

@V. Michel's ansew ist besser als meins. Tatsächlich kann man List.fold_left benutzen, indem man '@' verwendet oder List.fold_right benutzt, indem man '' 'wie Michel in' else (res, x :: acc) 'u verwendet Kann man List.fold_left verwenden, indem man es durch 'else (res, acc @ [x])' corse ändert, sollte man die Reihenfolge der Parameter in fold_left ändern. –

0
let rec seperate_by l sign= 
    let rec aux2 = function 
     (head,[])->(head,[]) 
     |(head,x::y::r) when x=y -> if List.exists ((=) x) sign then ([email protected][],y::r) else aux2 ([email protected][x],y::r) 
     |(head,x::r) -> if List.exists ((=) x) sign then (head,r) else aux2 ([email protected][x],r) 
    in 
    let res = aux2 ([],l) 
    in 
    match res with 
     |(head,[])->head::[] 
     |(sub_list,rest_list) -> (sub_list)::(seperate_by rest_list sign)  
+0

Ich habe einen neuen Fall hinzugefügt.Zhenyus Antwort ist klarer, aber ich möchte wissen, wie Sie es konvertieren, um das Format zu falten –