inductive data type和coinductive data type有啥区别

Haskell 没法解释,它是延迟求值的不能区分 Inductive 和 Coinductive。(而且 Haskell 程序员还特别喜欢滥用 Coinduction。)
Idris 里面的话,下面的定义
codata Colist : Type -\u0026gt; Type where Nil : Colist a (::) : a -\u0026gt; Colist a -\u0026gt; Colist a等于
data Colist : Type -\u0026gt; Type where Nil : Colist a (::) : a -\u0026gt; Inf (Colist a) -\u0026gt; Colist a其中的 Inf a 定义为 Delay Infinite a,即表明是延迟求值。
从语义上看,Inductive type 描述了如何从更小的 term 构造更大的 term,Coinductive 则相反,描述了从更大的 term 怎么分解成更小的 term。

■网友
Haskell的惰性求值确实不能区分inductive和coinductive。
简单来说,能够一块一块建起来的就是inductive type,例如自然数,二叉树,链表。另一个特点就是它们都是有限的。
相反,coinductive type是可以一块一块拿出来的,而且是可以无限拿的,最典型的例子就是数据流。
至于为什么Haskell不能区分这两个东西呢,以自然数为例,在Haskell里可以定义一个fixed point
data Nat = Zero | Succ Natf: Natf = Succ fHaskell会把f当成type为Nat的值。然而,在做pattern match的时候f永远都会被match到Succ f,不会到达Zero,也就是可以一块一块无限地拿出来,这个就变得和coinductive type一样了。在非惰性语言里,f就直接成了无限循环而不是一个值,不会被当成Nat type,就没有这个问题。
【inductive data type和coinductive data type有啥区别】


    推荐阅读