haskell 递归数据类型定义在惰性语言和严格语言中的含义

pxiryf3j  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(127)

如果我写一些

data L t = Empty | L t (L t)

在haskell中,这种类型允许无限列表,如L 1 (L 2 (L 3 (..)))。在严格语言(如ML)中,等价的代数类型定义是否也允许无限列表?如果是,是否是语言求值机制的缺陷,无法实际给它一个无限列表?如果不是,ML如何从该类型中排除无限列表?
其次,从理论的Angular 来看,类型中的值的类是某个生成函数的最小不动点吗?(比较一下,像阶乘这样的递归函数定义的值是相关生成函数的lfp)

e3bfsja2

e3bfsja21#

在OCaml中有循环列表:

let rec c = 1 :: 2 :: 3 :: c

ML如何从该类型中排除无限列表?
如果禁止对非函数类型进行递归定义,那么就无法构造无限列表。
从理论的观点来看,类型中的值的类是某个生成函数的最小不动点吗?
不动点确实是在指称语义中建模类型的一种常用方法。首先,从符号上看,我们可以看到:

L a = Nil | Cons a (L a)

使L a成为F的固定点:

F x = Nil | Cons a x

事实上,我们已经:

L a = F (L a)

这里Nil表示单位空间,Cons a xax的乘积,|是和。
根据"空间"和那些运算(单位、乘积和求和)的含义,您会得到不同的结果。

  • 如果你把它们看作集合,那么最小的不动点就是有限列表的集合,而"最大的不动点"--实际上是最终的余代数--是包含有限列表和无限列表的集合。
  • 另一种常见的空间类型是domains,表示"部分计算值"的顺序结构,特别是ω-complete partial orders。使用一些适当的和与积的概念,可以得到有限和无限列表及其部分前缀的空间(一米七氮一x,一米八氮一x,一米九氮一x,⊥ : ⊥ : ⊥ ...)作为上述F的初始代数和最终余代数(当讨论代数结构上(而不是代数结构上)的运算时,"最小不动点"和"最大不动点"的推广)。

相关问题