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
.
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)
Denken wir über diese Zeile nach:
%Vor% Was ist der Typ von net0
? Es scheint zu sein
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
oder wrap net0
in seiner eigenen Existenz:
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:
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.
Tags und Links haskell ghc dependent-type