2017-02-14 14 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);

и поток из них: 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

 Смежные вопросы

  • Нет связанных вопросов^_^