Lassen Sie uns sagen, ich habe eine unendliche Folge von Aktionen, von denen jede das Ergebnis eines bestimmten Typs zurückgibt. Etwas wie:Unendlich (endlich-periodische) HList in Haskell
newtype Stream a = Stream (IO (a, Stream a))
Aber mit a
im Laufe der Zeit verändert. Ich möchte diese Sequenz stark eintippen. Es ist natürlich nicht Sinn für beliebige unendliche Typ-Sequenz und naiven Ansatz machen, so dass:
data HStream :: [u] -> * where Cons :: Proxy x -> HStream xs -> HStream (x ': xs)
infiniteInt = Cons (Proxy :: Proxy Int) infiniteInt
zu einer unendlichen Art führen wird, die nicht von Haskell Typ-System unterstützt wird. Aber ich sehe nichts Falsches mit einem endlich-periodischen HLists (d. H. Eine solche welche Art Sequenz wird sich von irgendeinem Punkt wiederholen: [Bool, Int, Int, Sting, Int, Sting, Int, Sting ... ]
). Und ich denke auch, dass, wenn wir eine stark normalisierende Weise haben, den unendlichen Typ oder eine Art zu beschreiben, einen Beweis für unendliche Typgleichheit zu liefern, die in einer endlichen Anzahl von Schritten überprüft werden kann, es möglich sein sollte, Programme mit solchen unendlichen Typen zu prüfen.
Hat jemand eine Idee, wie solche Typen in Haskell dargestellt und verwendet werden können? Lasst uns für jetzt von endlos-periodischer hlist ausgehen, aber ich werde es auch schätzen, wenn jemand eine Idee hat, wie es für eine breitere Klasse von unendlichen Tupeln verallgemeinert werden kann und wo Generalisierungsgrenzen liegen.
'Datenstrom a = IO (a, Stream a)' ist seltsam, da Sie 'IO' als Konstruktor verwenden. Ist das beabsichtigt, oder meintest du "Datenstrom a = Stream (IO (a, Stream a))"? – Zeta
Sorry 'Datenstrom a = Stream (IO (a, Stream a))' natürlich. – schernichkin