在OCaml中调用lazy-list函数 [英] Call lazy-list function in OCaml

查看:0
本文介绍了在OCaml中调用lazy-list函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何调用以下函数才能计算从1到100的数字?

type 'a llist = Cons of 'a * (unit -> 'a llist)
let rec lnat n = Cons (n, fun () -> lnat (n+1))

调用lnat 1给我以下信息:

lnat 1;;
- : int llist = Cons (1, <fun>)

但如何计算以下数字?

推荐答案

如果目标是将(an的有限前缀)llist转换为普通list,我们可以使用简单的递归帮助器函数来实现。

let rec take n (Cons (x, xs)) =
  if n = 0 then [] else x :: take (n - 1) (xs ())

用作

# take 100 (lnat 1);;
- : int list =
[1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21;
 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; 35; 36; 37; 38; 39; 40;
 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; 51; 52; 53; 54; 55; 56; 57; 58; 59;
 60; 61; 62; 63; 64; 65; 66; 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78;
 79; 80; 81; 82; 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97;
 98; 99; 100]

表示中的llist严格存储第一个值,然后将其余计算隐藏在接受()的函数后面。由于该函数接受()(即没有实参),因此它唯一的选择(除了产生副作用之外,我认为在这种情况下这将是意外的行为)是产生一个常量值。

因此,它实际上只是一个无限列表,其中函数Part;保护列表的其余部分不会淹没您的计算机内存。若要访问以下元素,请将函数应用于(),这是unit类型的唯一有效值。

这篇关于在OCaml中调用lazy-list函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆