所以我最近一直在阅读关于共归纳法的文章,现在我想知道:Haskell 列表是归纳法还是归纳法?我也听说 Haskell 不区分这两者,但如果是这样,他们是如何正式区分的?
列表是归纳定义的,data [a] = [] | a : [a]
,但可以互归纳地使用,ones = a:ones
。我们可以创建无限列表。然而,我们可以创建有限列表。那么它们是什么?
相关是在 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 不区分归纳类型和共归纳类型吗?如果是这样,那它的形式化是什么?如果不是,那么哪个是[a]?
HList 是互感的吗?如果是这样,协约类型如何包含有限值?
如果我们定义了
data HList' a = L (List a) | R (Stream a)
呢?会考虑什么和/或它会比 just 有用HList
吗?