Ich las durch a GADT walkthrough und blieb bei einer der Übungen stecken. Die gegebene Datenstruktur ist:Tail-Funktion für "sichere Liste" mit GADTs
{-# LANGUAGE GADTs, EmptyDataDecls, KindSignatures #-}
data NotSafe
data Safe
data MarkedList :: * -> * -> * where
Nil :: MarkedList t NotSafe
Cons :: a -> MarkedList a b -> MarkedList a c
Die Übung ist eine safeTail
Funktion zu implementieren. Ich mag es ähnlich wie die tail
Funktion in Prelude handeln:
safeTail (Cons 'c' (Cons 'a' (Cons 't' Nil))) == Cons 'a' (Cons 't' Nil)
safeTail (Cons 'x' Nil) == Nil
safeTail Nil -- type error (not runtime!)
(ich eigentlich nicht ==
definieren, aber hoffentlich ist es klar, was ich meine)
Kann dies geschehen? Ich bin mir nicht ganz sicher, was der Typ überhaupt wäre ... vielleicht safeTail :: MarkedList a Safe -> MarkedList a NotSafe
?
Beachten Sie, dass die Lösung, die aus dem Kapitel erst vor fünf Minuten verlinkt war offensichtlich falsch. Danke, dass du mich indirekt zu diesem "Käfer" geführt hast. – duplode
Ich denke, Sie haben die falsche Antwort hier akzeptiert, auch wenn die, die Sie akzeptiert haben, auch interessant ist. Die Übung lädt Sie nicht zum Ändern des Datentyps ein. –