当我在 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
你没有这样的错误。
练习:解释这两种情况的区别。