2017-02-14 42 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