所以我最近读了一些关于共归纳的文章,现在我想知道: 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列表中得到了我期望的行为,即我可以同时建立有限的和无限的结构。
让我把它们归结为几个核心问题:
data HList' a = L (List a) | R (Stream a)
呢?那会考虑什么和/或它对HList
有用吗?发布于 2016-10-04 16:49:03
ones = 1 : ones
这样的定义。懒惰意味着ones
可以在一个步骤中被计算到1 : ones
,而其他语言只能计算为正常形式,而ones
没有正常形式。codata A : Type where MkA : A
不可能是无限的。HList
相反,你永远不可能“知道”它是有限的还是无限的(具体来说,如果列表是有限的,你可以在有限的时间内发现,但不能计算它是无限的),HList'
给出了一种简单的方法,可以在常数时间内确定列表是有限的还是无限的。https://stackoverflow.com/questions/39854514
复制相似问题