ocaml 中的懒惰评估
lazy evaluation in ocaml
我不明白如何调用 lseq
函数,以便它永远 运行。
type 'a llist = LazyList of 'a * (unit -> 'a llist)
let rec lseq nr =
LazyList (nr, fun () -> lseq (nr+1))
如果我打电话
lseq 5
我明白了
int llist = LazyList (5, <fun>)
每次调用 lseq
都会构造一个 'a llist
类型的新值。该值将由两部分组成。第一部分是列表元素,在此步骤中生成,第二部分是将生成列表其余部分的函数。然后函数还没有被调用,所以函数不会循环。
通俗地说,列表是具有一个值和一个 phone 数字的一对,您应该调用它来获取其余的。因此,如果您需要更多值,则需要调用更多,例如
let rec print_lseq (LazyList (x,next)) =
print_int x;
print_lseq (next ())
当然,这个函数永远不会终止,并且会打印无限的数字序列。
关于你的例子,lseq 5
是一个无限序列,看起来像:5, 6, 7, ...
。它不是在记忆中急切构建的,而是更像是一个菜谱,如何构建序列。
我不明白如何调用 lseq
函数,以便它永远 运行。
type 'a llist = LazyList of 'a * (unit -> 'a llist)
let rec lseq nr =
LazyList (nr, fun () -> lseq (nr+1))
如果我打电话
lseq 5
我明白了
int llist = LazyList (5, <fun>)
每次调用 lseq
都会构造一个 'a llist
类型的新值。该值将由两部分组成。第一部分是列表元素,在此步骤中生成,第二部分是将生成列表其余部分的函数。然后函数还没有被调用,所以函数不会循环。
通俗地说,列表是具有一个值和一个 phone 数字的一对,您应该调用它来获取其余的。因此,如果您需要更多值,则需要调用更多,例如
let rec print_lseq (LazyList (x,next)) =
print_int x;
print_lseq (next ())
当然,这个函数永远不会终止,并且会打印无限的数字序列。
关于你的例子,lseq 5
是一个无限序列,看起来像:5, 6, 7, ...
。它不是在记忆中急切构建的,而是更像是一个菜谱,如何构建序列。