懒惰的x,f x,f(f x)列表,

时间:2017-04-30 05:39:32

标签: ocaml lazy-sequences ocaml-batteries

Batteries.LazyList允许定义惰性列表。我想定义一个由xf xf (f x)f (f (f x))等组成的惰性列表。

根据模块文档中的注释,似乎from_loop是我想要的功能:

from_loop data next根据将next应用于data,然后应用于结果等的连续结果创建(可能是无限的)惰性列表。”

这个描述表明,如果我想要一个非负整数的惰性列表,例如,我可以像这样定义它:

let nat_nums = from_loop 0 (fun n -> n + 1)

但是,由于from_loop的签名是

,因此失败
'b -> ('b -> 'a * 'b) -> 'a LazyList.t

因此next函数具有签名('b -> 'a * 'b)。在utop中,错误消息为n + 1加下划线并说

Error: This expression has type int but an expression was expected of type 'a * int

我不明白'a应该是什么。为什么next函数应该返回一对?为什么列表的类型应该是'a LazyList.t?元素的类型不应该与next函数的参数类型相同吗?函数的描述并没有让我明白答案。

如果它有用,我对我想要做的事情的概念来自Clojure的iterate。在Clojure中,我可以像这样创建上面的定义:

(def nat-nums (iterate (fn [n] (+ n 1)) 0))

2 个答案:

答案 0 :(得分:2)

传递给onCreate的函数必须返回一对。该对的第一个元素是您要返回的值。该对的第二个元素是稍后计算 next 元素所需的状态。

您的代码:

Activity

只计算延迟列表的下一个元素,它不会返回下一个调用所需的状态。这样的事情是想要的:

$(document).ready(function(){
    $('.port').hide();

    $('.click').click(function(){
        $('.port').show();
        $('.bio').animate({left:'15em'}, 2500);
        $('.web').animate({left:'12.5em', top:'6.5em'}, 3500);
        $('.resume').animate({top:'5.3em', left:'25px'},2500);
        $('.social').animate({top:'.5em', left:'25px'}, 2500);   
        $(this).fadeOut(3000, function(){$('.name').fadeIn(); }).css({backgroundColor: rgba(59,207,119,.2)});    
     });
 });

(这将返回一个以0开头的列表,我认为这就是你想要的。)

这个公式比你的clojure例子更灵活,因为它允许你保持与返回值不同的任意状态。您为from_loop提供的类型属于(fun n -> n + 1) 类型。

我现在没有电池,所以我无法试试。但我认为根据类型确定它是正确的。

答案 1 :(得分:0)

事实证明,我真正想要的功能是LazyList.seq,而不是from_loop。虽然from_loop有其用途,但seq更简单,可以满足我的需求。唯一的技巧是你必须提供第三个参数,这是一个终止测试,当列表结束时返回false。我想要一个无限的名单。可以使用始终返回true的终止函数来创建它:

let nat_nums = seq 0 (fun n -> n + 1) (fun _ -> true);;
LazyList.to_list (LazyList.take 8 nat_nums);;
- : int list = [0; 1; 2; 3; 4; 5; 6; 7]