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 pointdata 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有啥区别】
推荐阅读
- 思域|2022款本田思域Type R路试谍照,多处搭载运动套件
- 汽车知识|全新捷豹F-TYPE海外实车 雅痞气质的跑车
- 捷豹|四缸引擎有画无声?2021款捷豹 F-Type P300 初体验
- 二叉树c语言模块化实现要写头文件吗
- 趣头条|本田思域Type-R限量版发售
- 普通车|飞度再进化,将推出红标Type-R高性能版
- |本田思域Type-R限量版曝光 搭载2.0T引擎 造型激进 轻量化设计
- 思域|十一代思域Type R曝光?溜背小翘臀,输出或突破400匹!
- GL8|透明金属风,ORICO这款Type-C扩展坞功能丰富还帅气
- pandas中DataFrame返回值问题为何总是一行
