Frage

In Python map() funktioniert auf alle Daten folgt, dass die Sequenz-Protokoll.Es macht Das Richtige^TM, ob ich füttere es ein string oder eine Liste oder sogar ein Tupel.

Kann ich meinen Kuchen in OCaml zu?Ich habe wirklich keine andere Wahl, als Blick in die Sammlung geben, die ich verwende, und finden Sie eine entsprechende Liste.Karte oder ein Array.Karte oder einen Puffer.Karte oder ein String sein.Karte?Einige dieser gar nicht existieren!Ist das, was ich Fragen, für ungewöhnlich?Ich muss etwas fehlen.

War es hilfreich?

Lösung

Die nächstgelegene Sie diese erhalten wird, ist das Modul Enum in OCaml Batterien im Lieferumfang enthalten (früher von extlib ). Enum definiert Karten und umgeknickt Enum.t; Sie müssen nur eine Umwandlung verwenden / von Enum.t für Ihren Datentyp. Die Umwandlungen können ziemlich geringes Gewicht, weil Enum.t faul ist.

Was Sie wirklich wollen, ist Haskell-Stil Typklassen , wie Foldable und Functor (die verallgemeinert "Karten"). Die Haskell Bibliotheken definieren Instanzen Foldable und Functor für Listen, Arrays und Bäumen. Eine weitere relevante Technik ist die „Schrott Ihre Boilerplate“ -Ansatz generische Programmierung. Da OCaml nicht Typklassen unterstützen oder höheren kinded Polymorphismus , glaube ich nicht, Sie würden die Lage sein, Muster wie diese in ihrer Art System zum Ausdruck bringen.

Andere Tipps

Es gibt zwei Lösungen in OCaml:

  1. Jacques Garrigue bereits ein syntaktisch-Licht, aber ineffizienter Ansatz für viele Datenstrukturen vor einigen Jahren.Sie nur wickeln Sie die Sammlungen von Objekten, die bieten eine map Methode.Dann können Sie collection#map so verwenden Sie die Karte Funktion, die für jede Art von Sammlung.Dies ist allgemeiner als Ihre Anforderungen, denn es können unterschiedliche Arten von Daten-Strukturen ersetzt werden zur Laufzeit.Dies ist jedoch nicht sehr nützlich in der Praxis, so der Ansatz war nie weit verbreitet.

  2. Eine syntaktisch-schwerer, aber effiziente, robuste und statische Lösung ist die Verwendung von funktoren zu parametrieren Sie Ihren code über die Datenstruktur, die Sie verwenden.Dies macht es trivial, um die Wiederverwendung von code mit unterschiedlichen Datenstrukturen.Siehe Markus Mottl ' s OCaml übersetzungen von Okasaki Buch "Rein Funktionale Datenstrukturen" für einige gute Beispiele.

Wenn Sie sind nicht auf der Suche nach dieser Art von macht und wollen einfach nur die Kürze, dann, natürlich, Sie können erstellen Sie einfach ein Modul-alias mit einem kürzeren Namen (z.B.Modul S = String).

Das Problem ist, dass jeder Behälter eine andere Darstellung hat und anderen Code für Karte erfordert / reduzieren darüber iterieren. Aus diesem Grund gibt es getrennte Funktionen. Die meisten Sprachen bieten eine Art allgemeine Schnittstelle für Container (wie die Sequenzprotokoll Sie erwähnt) so Funktionen wie Map / Reduce kann abstrakt umgesetzt werden, dies ist jedoch nicht für die Typen getan Sie genannt haben.

Solange Sie ein Typ t und val definieren vergleichen (: t-> t-> int) in Ihrem Modul, Map.Make wird Ihnen die Karte, die Sie wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top