2017-02-14 2 views
0

Compte tenu de ces déclarations je rencontrais des flux compréhension de problèmes dans SML:combinant deux cours d'eau, élément de traction d'un alors d'autres

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())); 

Je peux créer un flux de Naturals [1.0,2.0,3.0 ...] comme si: val nat = from 1.0 (fn x => x+1.0);

et un flux de ceux: val one = from 1.0 (fn x => x);

Mais comment pourrais-je faire pour créer un flux à partir de ces deux cours d'eau? Plus précisément, une fonction qui fusionne deux flux et génère un flux.

quelque chose comme: fun merge a b où a et b sont des flux. Autrement dit, si nous avons fait take 5 après la fusion de ces deux, il donnerait [1.0,1.0,2.0,1.0,3.0]

Répondre

3

Si cela était une liste, vous écrivez

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

puis vous ajoutez une fonction indirection à chaque contre à « streamify » il:

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

très soignée, jeu mal avec elle remerciement – user3831011