2017-10-03 4 views
2

Ich möchte die Liste der Tupel in Tupel der Liste konvertieren, und die erste Liste der Tupel besteht aus dem ersten Element des ursprünglichen Tupelelements. Zum BeispielListe der Tupel in Tupel der Liste in OCaml konvertieren

convert [(1,2);(3,4);(5,6)] = ([1;3;5],[2;4;6]) 

so.

Ich versuchte mehrmals und Erfolg, [1; 3; 5] zu erhalten, indem ich folgenden Code folge.

let rec convert lst = 
    match lst with 
    |[]->[] 
    |(a,b)::tl->a::(convert tl) 

Jedoch habe ich keine Ahnung, wie zweite Listenelement von Tupel zu erhalten [2; 4; 6] und wie sie in einem Tupel zu verschmelzen.

+0

Die Lösung, an der Sie arbeiten, ist nicht tail rekursiv und es gibt eine Möglichkeit, dies rekursiv zu tun. Versuchen Sie, Ihre mit Hilfe von @ PatJ's Antwort zu beenden und dann versuchen Sie es tun Schwanz rekursiv, es ist eigentlich einfach und ein schönes Training. ;-) – Lhooq

Antwort

4

Die einfachste Möglichkeit besteht darin, die Standardbibliothek List.split zu verwenden, die genau das leistet, was Ihre convert-Funktion tun soll.

Nun, wenn dies Teil einer Übung ist, werde ich Ihnen nicht die ganze Lösung geben, aber hier sind ein paar Hinweise.

Zuerst müssen Sie ein Tupel der Liste zurückgeben. Offensichtlich muss die Übereinstimmung der leeren Liste ein Paar leerer Listen zurückgeben.

Nun, wie für den kniffligen Teil, vorausgesetzt, Sie haben (a,b)::tl, zuerst zu bekommen ist offensichtlich eine Sache zu tun. Was können Sie tun, wenn Sie in let (tla,tlb) = convert tl schreiben? Kannst du es jetzt lösen?

+0

Ich habe versucht, das ungefähr eine Stunde zu bekommen und es endlich zu lösen! Danke vielmals – dongsu