wie man eine Unterliste aus einer Liste in Ocaml bekommt

8

Ich schaue mir die List-Dokumentation an. Es scheint, dass die Bibliothek keine sublist -Funktion bereitstellt.

Ich versuche eine Liste von Elementen von i zu j zu bekommen. Jetzt muss ich es schreiben als:

%Vor%

Das ist ziemlich knapp, aber ich stelle die Effizienz von List.nth in Frage, denn wenn es O (n) ist, würde ich es lieber auf eine weniger prägnante Art schreiben müssen.

>

Ich frage mich, warum sie List.sublist func nicht zur Verfügung stellen, wenn List.nth nicht O (1) ist, weil es so eine ziemlich gewöhnliche Operation ist.

    
romerun 25.04.2010, 22:31
quelle

4 Antworten

9
%Vor%

Das Obige ist mehr oder weniger eine abgeholzte Version von newacts Lösung. Die Lösung von newacct weist eine Zwischenliste ( drop i list ) zu, die für den Compiler in Haskell optimiert werden kann, aber viel schwieriger in ML. Daher ist seine Version vollkommen in Ordnung für eine Haskell-Funktion und marginal suboptimal für eine ML-Funktion. Der Unterschied zwischen den beiden ist nur ein konstanter Faktor: beide sind O (e). zrr's Version ist O (length (l)), da List.filteri nicht weiß, dass f erst nach einer Weile false zurückgibt, sondern für alle Elemente in l .

Ich bin nicht sehr glücklich, b negativ werden zu lassen, aber die Version, in der das nicht der Fall ist, ist komplizierter.

Eine Referenz unter vielen für die Entwaldung, wenn Sie interessiert sind: Ссылка

    
Pascal Cuoq 26.04.2010, 23:57
quelle
5

Schreiben Sie zuerst die Funktionen take (erste n Elemente) und drop (alles außer den ersten n Elementen) (wie in Haskell). Dann ist sublist i j lst nur take (j-i) (drop i lst)

    
newacct 26.04.2010 05:30
quelle
2

Dies ist ein bisschen schwieriger als es sollte mit OCaml Standard-Bibliothek sein --- die Standard-Bibliothek ist ein bisschen spärlich. Wenn Sie eine der erweiterten Standardbibliotheken verwenden, wird es einfacher. Mit Core könnten Sie beispielsweise schreiben:

%Vor%

Ich stelle mir vor, dass etwas Ähnliches mit Extlib / Batterien möglich ist.

    
zrr 26.04.2010 02:54
quelle
0

Während die Antwort von Pascal einen netten Kandidaten für List.sublist implementiert, ist die richtige Antwort, dass Sie wahrscheinlich besser ein Array einer Liste verwenden sollten. Die Array-Module implementieren die Array.sub -Funktion, die Sie verwenden könnten.

Während in vielen Imperativsprachen wie C ++ oder Perl im Wesentlichen kein Unterschied zwischen Listen und Arrays besteht, ist dies in OCaml nicht das Gleiche:

  • Listen sind besser für rekursive Behandlungen und sequenziellen Zugriff geeignet, dh ist normalerweise ein besserer Kandidat für ein Array als Argument für eine rekursive Funktion, und normalerweise möchten Sie sich alle ansehen die Elemente der Liste.

  • Arrays eignen sich besser für den wahlfreien Zugriff, Strukturänderungen (z. B. Sortieren) oder für numerische Berechnungen.

quelle

Tags und Links