Antworten:
Das Richtige ist das Setup
data ListF a x = Nil | Cons a x
Jetzt kannst du schreiben
newtype Mu f= Mu (forall a.(f a->a)->a)
data Nu f = forall a. Nu a (a->f a)
In Haskell können wir das beobachten Mu ListF
und Nu ListF
zusammenfallen. Es kann also entweder (!) Sein. (Eine Quelle zu dieser Behauptung: http://www.cs.ox.ac.uk/jeremy.gibbons/publications/adt.pdf )
Darüber hinaus können wir Dinge durch Induktion auf allen Listen beweisen und Beweise erhalten, die funktionieren, solange wir uns darauf beschränken, uns um endliche zu kümmern, wie hier beschrieben: http://www.cs.ox.ac.uk/jeremy.gibbons/ Veröffentlichungen / fast + lose.pdf
Zwei weitere Referenzen hierzu sind:
http://homepages.inf.ed.ac.uk/wadler/papers/free-rectypes/free-rectypes.txt (ein historisch zentrales Dokument)
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.37.1418 (was eine ausgezeichnete Ausstellung ist)
Es ist der größte Fixpunkt oder die endgültige Kohlegebra, je nachdem, wie Sie die Dinge einrichten. In Haskell ist es unmöglich, den Datentyp endlicher Listen zu definieren, da Haskell keine induktiven Typen hat, sondern nur die koinduktiven. Viele Menschen leugnen dieses spezielle Problem.
[a]
in Haskell nicht durch Induktion nachweisen. Sie können dies für eine Teilmenge der Werte tun, nämlich für die endlichen Listen. Aber das ist nicht was [a]
ist.