4

Haskell (GHC) でこのようなものを定義すると、リスト スタイルの無限型エラーが発生しないのはなぜですか?

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

型エラーなしでコンパイルされますが、明らかに使用できない型です:定義する必要があります

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

4

2 に答える 2

13

それについて何も壊れていません。その型の値を定義することは完全に可能です:

foo = Broken "one" foo

基本的には、nil 値を持たないリスト型を定義するのと同じことです (これも完全に合法です)。その型の値を定義することは完全に可能ですが、そのような値はすべて無限でなければなりません。

于 2012-04-07T02:30:39.400 に答える
2

あなたが定義する場合

type Foo = (String, Foo)

次に、次のエラーが表示されるはずです: Cycle in type synonym declarations.

しかし、定義すると

data Foo = Foo String Foo

そのようなエラーは発生しません。

演習: この 2 つの状況の違いを説明してください。

于 2012-04-07T05:36:47.633 に答える