Eine Sache, die ich in Perl 6 ist eine intersperse
Funktion like Haskell has bisher verpasst haben, schreiben:Wie eine `intersperse` Funktion in Perl 6
Die intersperse Funktion nimmt ein Element und eine Liste und` streut dieses Element zwischen den Elementen der Liste.
z. dies:
intersperse <X Y>, (<a b>, <c d>, <e f>);
... sollte diese Sequenz zurück:
<a b>, <X Y>, <c d>, <X Y>, <e f>
Also habe ich versucht, es zu implementieren mich als eine benutzerdefinierte Funktion. Für eine maximale Wiederverwendbarkeit, es sollte:
- Unterstützung jeder Art von Objekt (einschließlich Liste und Nil) als Elemente.
- Ändern Sie nicht die Containerisierung von Elementen in irgendeiner Weise.
- Die innere Struktur der Elemente in keiner Weise abflachen oder anderweitig beeinträchtigen.
- Geben Sie eine Lazy-Sequenz zurück, wenn die Eingabeliste als Lazy-Sequenz angegeben ist, so dass sie für unendliche Sequenzen verwendet werden kann, wie in
intersperse 42, 1..Inf
.
Was ich mit so weit habe kommen, ist dies:
sub intersperse (\element, +list) {
((element xx *) Z list).map(|*)[1..*]
}
Das heißt: Stufenlos das Element wiederholen setzt werden, ist es mit der Liste zip, dann map
jedes Tupel zu slip
verwenden um die durch die Zip-Datei hinzugefügte Verschachtelungsschicht zu entfernen, ohne die ursprünglichen Elemente zu verflachen, und dann einen Array-Index zu verwenden, um die führende Wiederholung des eingestreuten Elements zu entfernen.
es die Anforderungen erfüllt, 1-3, aber nicht mehr als 4, weil der Array-Index arbeitet mit Spannung (dh iteriert vollständig die Eingangssequenz und gibt dann eine nicht lazy List) und somit diese Funktion bewirkt, wenn gegeben aufzuhängen ein unendliche Sequenz.
Was wäre ein guter Weg, um diese Funktion zu implementieren, so dass sie alle 4 Anforderungen erfüllt?
Inter schätzend. Irgendwie wie eine 'List'-Version von' Join'. –