Kann eine endliche Liste in Perl 6 faul sein?

8

Angenommen, ich habe eine Sequenz, in der ich den Anfangs- und Endpunkt kenne und der Generator einfach ist. Kann ich es faul machen?

%Vor%

Ich möchte diese bekannte Liste mit sich selbst eine unbekannte Anzahl von Zeiten kombinieren, aber nicht die gesamte Liste sofort generieren. Ich möchte, dass @cross faul ist:

%Vor%

Ich weiß, dass ich dies durch andere einfache Dinge oder Programmierung (und meine Perl 5 Set :: CrossProduct tut genau das), aber ich bin neugierig, ob es einen einfachen und beabsichtigten Weg gibt, den ich vermisse. Irgendwie muss ich nicht alleine zählen.

Als Nebenfrage: Was macht eine Sequenz faul? Ist es nur der Endpunkt? Gibt es eine Sequenz mit einem bekannten Endpunkt, der immer noch faul sein kann, wenn der Generator unendlich viele Werte zwischen? Ich fragte mich, wie viele Informationen ich entfernen musste und versuchte so etwas:

%Vor%

Immer noch, das ist nicht faul.

    
brian d foy 13.04.2017, 08:18
quelle

4 Antworten

5

Die "is-faul" -Methode ist meiner Meinung nach eine falsche Bezeichnung. Das einzige was es sagt, wie Cuonglm sagte, ist, dass es nur weitergibt, dass der zugrunde liegende Iterator behauptet, er sei faul. Aber das noch bedeutet eigentlich gar nichts. Ein Iterator kann technisch Werte auf Anforderung erzeugen, behauptet aber immer noch, dass er nicht faul ist. Und umgekehrt.

Die "is-faul" -Kontrolle wird intern verwendet, um Fälle zu verhindern, in denen die Anzahl der Elemente im Voraus bekannt sein muss (wie .roll oder .pick): Wenn der Seq / Iterator behauptet, er sei faul, dann nicht eigentlich versuchen, aber scheitern oder werfen stattdessen.

Das Einzige, was .lazy tut, ist, den Iterator des Seq in einen anderen Iterator zu packen, der für lazy hält (wenn der angegebene Iterator natürlich behauptet, dass er nicht faul ist). Und stellen Sie sicher, dass es keine Werte ziehen wird, es sei denn wirklich benötigt. Also sagt das Hinzufügen von .lazy nichts darüber aus, wann Werte erzeugt werden, nur wann sie geliefert werden. Und es hilft beim Testen iteratorbasierter Logik, um zu sehen, wie sie mit einem Iterator funktionieren würden, der sich als faul bezeichnet.

Also, zurück zu der Frage: Wenn Sie sicher sein wollen, dass etwas faul ist, müssen Sie den Iterator selbst schreiben. Nachdem ich das gesagt habe, habe ich in den letzten Monaten ziemlich viel Mühe darauf verwendet, die Dinge im Kern so faul wie möglich zu machen. Bemerkenswerterweise ist xx N immer noch nicht faul, obwohl es heutzutage einen Seq erzeugt. Dass es faul wurde, brach einige Spectests auf einer tieferen Ebene, die ich bis jetzt noch nicht herausfinden konnte. Ich denke, Sie können sicher sein, dass die Dinge so faul sind, wie es im Allgemeinen Sinn macht, mit der Möglichkeit, Speicher gegenüber CPU vorzuziehen. Aber Sie werden nie die vollständige Kontrolle über die Buildins haben: Wenn Sie die vollständige Kontrolle haben wollen, müssen Sie es selbst schreiben.

    
Elizabeth Mattijsen 14.04.2017, 11:28
quelle
5
___ answer43461591 ___

Wie bereits erwähnt, bedeutet Seq eigentlich gar nichts.

Aber ich wollte nur erwähnen, dass es eine Seite auf Rakudo Wiki gibt , die ein paar gibt Hinweise darauf, was Sie von %code% erwarten können.

    
___ antwort43391726 ___

Ja, das geht mit fauler Methode :

%Vor%

Es gibt nichts besonderes %code% , das es faul macht, nur sein zugrunde liegender Iterator .

    
___ tag123lazyevaluation ___ Lazy Evaluation bezieht sich auf eine Vielzahl von Konzepten, die eine Evaluierung vermeiden wollen eines Ausdrucks, außer wenn sein Wert benötigt wird, und um die Ergebnisse der Auswertung eines Ausdrucks unter allen Verwendungen seines Ausdrucks zu teilen, so dass kein Ausdruck benötigt wird mehr als einmal bewertet werden. ___ answer46960615 ___

Sie können Folgendes machen:

%Vor%

faul, indem du einfach das %code% -Schlüsselwort an der richtigen Stelle hinzufügst:

%Vor%

Oder wie cuonglm gezeigt wurde, können Sie die Methode des Bereichs wie folgt aufrufen:

%Vor%     
___ tag123perl6 ___ Verwenden Sie das Perl6-Tag für alle Fragen zur Programmiersprache Perl 6. ___ qstntxt ___

Angenommen, ich habe eine Sequenz, in der ich den Anfangs- und Endpunkt kenne und der Generator einfach ist. Kann ich es faul machen?

%Vor%

Ich möchte diese bekannte Liste mit sich selbst eine unbekannte Anzahl von Zeiten kombinieren, aber nicht die gesamte Liste sofort generieren. Ich möchte, dass %code% faul ist:

%Vor%

Ich weiß, dass ich dies durch andere einfache Dinge oder Programmierung (und meine Perl 5 Set :: CrossProduct tut genau das), aber ich bin neugierig, ob es einen einfachen und beabsichtigten Weg gibt, den ich vermisse. Irgendwie muss ich nicht alleine zählen.

Als Nebenfrage: Was macht eine Sequenz faul? Ist es nur der Endpunkt? Gibt es eine Sequenz mit einem bekannten Endpunkt, der immer noch faul sein kann, wenn der Generator unendlich viele Werte zwischen? Ich fragte mich, wie viele Informationen ich entfernen musste und versuchte so etwas:

%Vor%

Immer noch, das ist nicht faul.

    
___ answer43410632 ___

Die "is-faul" -Methode ist meiner Meinung nach eine falsche Bezeichnung. Das einzige was es sagt, wie Cuonglm sagte, ist, dass es nur weitergibt, dass der zugrunde liegende Iterator behauptet, er sei faul. Aber das noch bedeutet eigentlich gar nichts. Ein Iterator kann technisch Werte auf Anforderung erzeugen, behauptet aber immer noch, dass er nicht faul ist. Und umgekehrt.

Die "is-faul" -Kontrolle wird intern verwendet, um Fälle zu verhindern, in denen die Anzahl der Elemente im Voraus bekannt sein muss (wie .roll oder .pick): Wenn der Seq / Iterator behauptet, er sei faul, dann nicht eigentlich versuchen, aber scheitern oder werfen stattdessen.

Das Einzige, was .lazy tut, ist, den Iterator des Seq in einen anderen Iterator zu packen, der für lazy hält (wenn der angegebene Iterator natürlich behauptet, dass er nicht faul ist). Und stellen Sie sicher, dass es keine Werte ziehen wird, es sei denn wirklich benötigt. Also sagt das Hinzufügen von .lazy nichts darüber aus, wann Werte erzeugt werden, nur wann sie geliefert werden. Und es hilft beim Testen iteratorbasierter Logik, um zu sehen, wie sie mit einem Iterator funktionieren würden, der sich als faul bezeichnet.

Also, zurück zu der Frage: Wenn Sie sicher sein wollen, dass etwas faul ist, müssen Sie den Iterator selbst schreiben. Nachdem ich das gesagt habe, habe ich in den letzten Monaten ziemlich viel Mühe darauf verwendet, die Dinge im Kern so faul wie möglich zu machen. Bemerkenswerterweise ist xx N immer noch nicht faul, obwohl es heutzutage einen Seq erzeugt. Dass es faul wurde, brach einige Spectests auf einer tieferen Ebene, die ich bis jetzt noch nicht herausfinden konnte. Ich denke, Sie können sicher sein, dass die Dinge so faul sind, wie es im Allgemeinen Sinn macht, mit der Möglichkeit, Speicher gegenüber CPU vorzuziehen. Aber Sie werden nie die vollständige Kontrolle über die Buildins haben: Wenn Sie die vollständige Kontrolle haben wollen, müssen Sie es selbst schreiben.

    
___ qstnhdr ___ Kann eine endliche Liste in Perl 6 faul sein? ___
cuonglm 13.04.2017 11:58
quelle
1

Wie bereits erwähnt, bedeutet is-lazy eigentlich gar nichts.

Aber ich wollte nur erwähnen, dass es eine Seite auf Rakudo Wiki gibt , die ein paar gibt Hinweise darauf, was Sie von is-lazy erwarten können.

    
quelle
1

Sie können Folgendes machen:

%Vor%

faul, indem du einfach das lazy -Schlüsselwort an der richtigen Stelle hinzufügst:

%Vor%

Oder wie cuonglm gezeigt wurde, können Sie die Methode des Bereichs wie folgt aufrufen:

%Vor%     
J-L 26.10.2017 17:41
quelle

Tags und Links