Kann eine KnownNat zur Laufzeit zugewiesen werden?

8

Ich habe (erfolglos) versucht, ein "Objekt" * in Haskell in Runtime zu erstellen, dessen Typ zur Laufzeit mit abhängigen Typen definiert wurde.

Ich habe dieses Tutorial zu abhängigen Typen und was sie gemacht haben verwenden, um einen Wert für die Laufzeit zu übergeben, ist eine Funktion, die ein Sing als Parameter verwendet und Mustererkennung für den Wert von Sing verwendet, um die Anzahl zur Laufzeit zu erhalten. Aber ich habe keinen Zugriff auf Sing auf Mustervergleich.

Ich dachte, der folgende Code könnte funktionieren, aber was ich bekomme, ist eigentlich ziemlich enttäuschend, der Compiler sagt mir, dass n von der Typdefinition für randomNetwork nicht das gleiche n ist, das ich in der Typdefinition festgehalten habe von SNat .

%Vor%

Wie kann ich die Größe der "versteckten Ebene" zur Laufzeit definieren (ohne sie manuell zu erstellen)? wie könnte ich den Wert verwenden, den ich in Runtime auf der Typenebene erfasst habe?

Übrigens, das ist der Kompilierungsfehler, den ich mit dem obigen Code erhalte:

%Vor%

*: Ich weiß, wir nennen sie Werte (denke ich)

    
helq 01.10.2017, 01:39
quelle

1 Antwort

8

Denken wir über diese Zeile nach:

%Vor%

Was ist der Typ von net0 ? Es scheint zu sein

%Vor%

Was ist jedoch n ? Es liegt nicht in der Umgebung, da die Typumgebung von main leer ist. Und es wird auch nicht allgemein quantifiziert. Das ist das Problem, n kann sich auf nichts beziehen. Sie müssen entweder Ihre gesamte Arbeit mit net0 in der Umgebung erledigen, wo n an 1 gebunden ist, wie in

%Vor%

oder wrap net0 in seiner eigenen Existenz:

%Vor%

randomNetwork benötigt immer noch eine Typ-Signatur, weil wir angeben müssen, dass wir wirklich die n -Bindung in der vorherigen Zeile verwenden wollen, was uns zwingt, die Netzwerk-Spezifikation zweimal zu schreiben. Aber es kann mit der neuen Erweiterung TypeApplications bereinigt werden:

%Vor%

1 Das macht die Dinge nicht so unmöglich wie es aussieht. Sie können weiterhin net0 an Funktionen übergeben, die allgemein in n quantifiziert sind. Es bedeutet nur, dass wenn Sie einen Typ zurückgeben, der eine neue -Typ-Stufen-Nummer enthält, müssen Sie dies mit CPS tun oder ein Existential wie DogeNet verwenden.

    
luqui 01.10.2017, 04:31
quelle

Tags und Links