Haskell (GHC) でこのようなものを定義すると、リスト スタイルの無限型エラーが発生しないのはなぜですか?
data Broken = Broken { title :: String,
loop :: Broken }
型エラーなしでコンパイルされますが、明らかに使用できない型です:定義する必要があります
foo = Broken "one" (Broken "two" (Broken "three"
...
Haskell (GHC) でこのようなものを定義すると、リスト スタイルの無限型エラーが発生しないのはなぜですか?
data Broken = Broken { title :: String,
loop :: Broken }
型エラーなしでコンパイルされますが、明らかに使用できない型です:定義する必要があります
foo = Broken "one" (Broken "two" (Broken "three"
...
それについて何も壊れていません。その型の値を定義することは完全に可能です:
foo = Broken "one" foo
基本的には、nil 値を持たないリスト型を定義するのと同じことです (これも完全に合法です)。その型の値を定義することは完全に可能ですが、そのような値はすべて無限でなければなりません。
あなたが定義する場合
type Foo = (String, Foo)
次に、次のエラーが表示されるはずです: Cycle in type synonym declarations
.
しかし、定義すると
data Foo = Foo String Foo
そのようなエラーは発生しません。
演習: この 2 つの状況の違いを説明してください。