记录没有无限类型错误

时间:2012-04-07 02:11:41

标签: haskell types algebraic-data-types

为什么在Haskell(GHC)中定义类似的东西时没有列表样式的无限类型错误?

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

它编译没有类型错误,但显然它是一个不可用的类型:我必须定义

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

2 个答案:

答案 0 :(得分:13)

没有什么打破它。完全可以定义该类型的值:

foo = Broken "one" foo

基本上它与定义没有nil值的列表类型(这也是完全合法的)是一回事。完全可以定义该类型的值,但所有这些值都必须是无限的。

答案 1 :(得分:2)

如果你定义

type Foo = (String, Foo)

然后你应该收到这个错误:Cycle in type synonym declarations

但是如果你定义

data Foo = Foo String Foo

你没有这样的错误。

练习:解释这两种情况之间的区别。