在 OCaml 中使用“of”关键字

Hea*_*top 3 ocaml types functional-programming keyword lazy-evaluation

of在这些惰性列表的定义和使用该类型的函数中,关键字的作用是什么?它只是一个定义 类型的构造函数Cons,以便它接受 aunit并计算 a llist,还是还有更多需要考虑?

type 'a llist = Cons of 'a  * (unit -> 'a llist)

let rec lnat i = Cons (i, (fun () -> lnat (i + 1)))
Run Code Online (Sandbox Code Playgroud)

(-lnat函数接受一个 int 并从该输入 int 开始构造一个所有自然数的列表)。

Lho*_*ooq 5

of只是表达“这个代数数据类型构造函数由......组成”的一种方式。

但从你问题的其余部分来看,你似乎并没有真正理解代数数据类型和函数是什么。

它只是一个定义 Cons 类型的构造函数,以便它采用一个单位并计算一个 llist

嗯,不,Cons不接受 aunit并计算 a llist。相反,由一对和 类型的函数Cons组成。'aunit -> 'a llist

Cons是我们所说的a lazy list,因为除非你遍历它,否则它不会被构造。这是延迟计算。

lnat 函数接受一个 int 并从该输入 int 开始构建所有自然数的列表

再说一次,不。lnat接受 anint并返回一个 new Cons,其中包含 thisint作为其对的第一个成员以及一个来自unitto 的函数lnat (i+1)

这意味着这是一个无限递归函数,构造从到 的lnat所有自然数,但前提是您明确探索。iinfinityCons

例子:

lnat 0 > Cons (0, (fun () -> lnat 1))
Run Code Online (Sandbox Code Playgroud)

lnat 1在 a 后面fun (),不会计算它的值,从而使您的程序不会无限运行。