最近我在阅读有关共归的内容,现在我想知道:Haskell中的列表是归纳的还是共归的?我也听说过Haskell不区分这两者,但如果是这样,他们如何在形式上区分呢?
列表是归纳定义的,data [a] = [] | a : [a]
,但可以用于共归,ones = a:ones
。我们可以创建无限的列表(coinductive reasoning)。然而,我们也可以创建有限的列表。那么它们是哪种呢?
类似的,在Idris中,类型List a
严格地属于归纳类型,因此只能表示有限列表。它的定义方式与Haskell相同。然而,Stream a
是一个共归类型,表示无限长列表。它的定义为(或者说,与之等价的定义是)codata Stream a = a :: (Stream a)
。无法创建无限列表或有限流。然而,当我写下定义时:
codata HList : Type -> Type where
Nil : HList a
Cons : a -> HList a -> HList a
我从Haskell列表中获得了我所期望的行为,即我可以创建有限和无限结构。
因此,让我将它们归纳为几个核心问题:
Haskell是否不区分归纳类型和余归纳类型?如果是这样,那么它的正式化是什么?如果不是,那么哪一个是?
是否有关于HList的余归纳性质?如果有,那么如何使余归纳类型包含有限值?
如果我们定义了
data HList' a = L (List a) | R (Stream a)
,那会被认为是什么?相对于只有HList
有什么用处?
HList
类型通常被称为共列表(co-list)。 - Cactus