Hat Perl 6 einen unendlichen Int?

8

Ich hatte eine Aufgabe, bei der ich die nächste Zeichenkette zu einem Ziel finden wollte (also die Entfernung bearbeiten), ohne sie alle gleichzeitig zu erzeugen. Ich habe mir gedacht, dass ich die High-Water-Mark-Technik (niedrig, nehme ich an) benutze, während ich die nächste Bearbeitungsentfernung auf Inf initialisiere, so dass die Bearbeitungsentfernung näher ist:

%Vor%

Allerdings ist Inf eine Num , also kann ich das nicht tun:

  

Typprüfung bei Zuordnung zu $ ​​engster-so-far fehlgeschlagen; erwartet Int aber bekam Num (Inf)

Ich könnte die Einschränkung zu Num machen und dazu zwingen:

%Vor%

Das scheint jedoch ziemlich unnatürlich zu sein. Und da Num und Int nicht verwandt sind, kann ich keine Einschränkung wie Int(Num) haben. Das interessiert mich nur für den ersten Wert. Es ist einfach, das auf etwas ausreichend Hoch zu setzen (wie die Länge der längsten Saite), aber ich wollte etwas reineres.

Gibt es etwas, das mir fehlt? Ich hätte gedacht, dass jedes beliebige Ding einen besonderen Wert haben könnte, der größer (oder kleiner) als alle anderen Werte ist. Polymorphismus und all das.

    
brian d foy 22.07.2017, 20:36
quelle

1 Antwort

8

{neues Intro, das hoffentlich besser ist als das nicht hilfreiche / irreführende Original}

@ CarlMäsak, in ein Kommentar, den er unterhalb dieser Antwort geschrieben hat nach meiner ersten Version:

  

Das letzte Mal Ich habe mit Larry darüber gesprochen {im Jahr 2014} , seine Begründung schien es zu sein sei das ... Inf sollte für alle von Int, Num und Str funktionieren

(Die erste Version meiner Antwort begann mit einer "Erinnerung", von der ich folge, dass sie zumindest nicht hilfreich und plausibel eine völlig falsche Erinnerung war.)

In meiner Untersuchung als Antwort auf Carls Kommentar fand ich ein verwandtes Juwel in # perl6- dev im Jahr 2016 als Larry schrieb:

  

Dann könnte unsere Richtlinie lauten: Wenn Sie einen Int möchten, der ± Inf und NaN unterstützt, verwenden Sie stattdessen Rat

     

Mit anderen Worten, rate nicht, dass Rat mit Int konsistent ist, mach es konsistent mit Num

Larry hat diesen Beitrag geschrieben 6.c . Ich kann mich nicht erinnern, etwas gesehen zu haben, das für 6.d diskutiert hat.

{und jetzt zurück zum Rest meiner ersten Antwort}

Num in P6 implementiert den Gleitkommazahltyp IEEE 754. Gemäß der IEEE-Spezifikation muss dieser Typ mehrere konkrete Werte unterstützen, die reserviert sind, um für abstrakte Konzepte zu stehen, einschließlich des Konzepts der positiven Unendlichkeit. P6 bindet den entsprechenden konkreten Wert an den Begriff Inf .

Da dieser konkrete Wert, der die Unendlichkeit bezeichnet, bereits existierte, wurde er zu einem sprachweit gültigen allgemeinen Zweck konkreter Wert für Unendlichkeit für Fälle, die keine Gleitkommazahlen wie Unendlich in String- und Listenfunktionen enthalten .

Die Lösung für Ihr Problem, das ich unten vorschlage, ist die Verwendung einer where -Klausel über ein subset .

Eine where -Klausel ermöglicht es, die Laufzeitzuweisung anzugeben / Binding "Typchecks". Ich zitiere "typecheck", weil es die leistungsfähigste Form der Kontrolle ist - es ist rechnerisch universell und prüft im wahrsten Sinne des Wortes den tatsächlichen Laufzeitwert (anstelle einer statisch typisierten Ansicht dessen, was dieser Wert sein kann). Das heißt, sie sind langsamer und Laufzeit, nicht Kompilierzeit, aber es macht sie auch Weise mächtiger (um nicht zu sagen viel einfacher auszudrücken) als selbst abhängige Typen , die ein relativ innovatives Feature sind, das diejenigen, die fortgeschrittene, statisch typgeprüfte Sprachen bevorzugen, nur als in ihrer eigenen Welt verfügbar bezeichnen 1 und die "Bugs verhindern sollen, indem man extrem ausdrucksstarke Typen erlaubt" (aber viel Glück dabei herauszufinden, wie man sie ausdrückt ...;)).

Eine Teilmengen-Deklaration kann eine where -Klausel enthalten. Auf diese Weise können Sie die Prüfung benennen und sie als Einschränkung für einen benannten Typ verwenden.

Sie können also diese beiden Funktionen verwenden, um zu erhalten, was Sie wollen:

%Vor%

Verwenden Sie jetzt einfach subset als Typ:

%Vor%

1 . Siehe Unterstützt Perl 6 abhängige Typen? und es scheint der grobe Konsens ist nein .

    
raiph 23.07.2017, 05:44
quelle

Tags und Links