2012-04-07 8 views
4

Warum gibt es keine List-style unendlich Typfehler, wenn ich so etwas in Haskell (GHC) definieren?Kein unendlicher Typ Fehler für Datensätze

data Broken = Broken { title :: String, 
         loop :: Broken } 

Es kompiliert ohne Typen Fehler, aber es ist eindeutig eine ungeeignete Art: Ich würde

foo = Broken "one" (Broken "two" (Broken "three" ...

Antwort

13

Es gibt nichts gebrochen, darüber zu definieren. Es ist durchaus möglich, einen Wert dieses Typs zu definieren:

foo = Broken "one" foo 

Im Grunde ist es das gleiche wie die Definition einer Liste Typ, der keinen Nullwert hat (was auch vollkommen legal ist). Es ist durchaus möglich, Werte dieses Typs zu definieren, aber alle diese Werte müssen unendlich sein.

+0

Ooh guter Punkt - natürlich. – amindfv

2

Wenn Sie

type Foo = (String, Foo) 

definieren Dann sollten Sie diesen Fehler erhalten: Cycle in type synonym declarations.

Aber wenn Sie

data Foo = Foo String Foo 

definieren erhalten Sie keinen solchen Fehler.

Übung: Erklären Sie den Unterschied zwischen diesen beiden Situationen.

+0

Der Unterschied ist nur der Typ, nicht die Daten, oder? In einer untypisierten Sprache würde das funktionieren, denn wenn Sie ein unendlich ausgewertetes Tupel hätten, könnten Sie 'fst' mit einiger Tiefe auswerten. – amindfv

Verwandte Themen