2017-02-14 34 views
0

鉴于这些声明我有在SML无法理解流牵引件:合并两个流,从一个那么其他

exception Bad of string; 
fun from seed next = Cons(seed,fn() => from (next seed) next); 
fun head (Nil) = raise Bad("got nil in head") 
    | head (Cons(a,b)) = a; 

fun tail (Nil) = raise Bad("got nil in tail") 
    | tail(Cons(a,b)) = b(); 

fun take 0 stream = nil 
    | take n (Nil) = raise Bad("got nil in take") 
    |take n (Cons(h,t)) = h::(take (n-1) (t())); 

我可以创建土黄流[1.0,2.0,3.0 ...]像所以:val nat = from 1.0 (fn x => x+1.0);

和1的数据流:val one = from 1.0 (fn x => x);

但我怎么去创造这两个流的流?特别是一个合并两个流并输出流的函数。

类似于:fun merge a b其中a和b是流。也就是说,如果我们合并这两个后做take 5它会给[1.0,1.0,2.0,1.0,3.0]

回答

3

如果这是一个列表,你会写

fun merge a b = Cons (head a, Cons (head b, merge (tail a) (tail b))) 

,然后添加一个函数间接给每个缺点“流化”它:

fun merge a b = Cons (head a, fn() => Cons (head b, fn() => (merge (tail a) (tail b)))) 
+0

非常整洁,生病玩耍它谢谢你 – user3831011