Sml 合并两个流,从一个流中提取元素,然后从另一个流中提取元素

Sml 合并两个流,从一个流中提取元素,然后从另一个流中提取元素,sml,Sml,鉴于这些声明,我很难理解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(

鉴于这些声明,我很难理解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…],如下所示:
valnat=from1.0(fnx=>x+1.0)

和一个流:
valone=from1.0(fnx=>x)

但是我如何从这两个流创建一个流呢?特别是一个合并两个流并输出一个流的函数


类似于:
fun merge a b
,其中a和b是流。也就是说,如果我们在合并这两个元素后取5,它将得到[1.0,1.0,2.0,1.0,3.0]

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

fun merge a b = Cons (head a, Cons (head b, merge (tail a) (tail b)))
然后向每个cons添加一个间接函数以“流线化”它:


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

fun merge a b = Cons (head a, Cons (head b, merge (tail a) (tail b)))
然后向每个cons添加一个间接函数以“流线化”它: