生成自然数并使用Concurrent ML中的2个通信服务器打印它们

时间:2013-11-29 05:28:44

标签: concurrency sml smlnj ml

我有一个功课,我需要写两个通信服务器,一个生成自然数字,另一个打印它们。生成服务器将发送到打印服务器。服务器应该通过共享通道chan进行通信。主要功能应该为每个服务器生成一个线程。

`

    val sender = fn : int -> unit

    val receiver = fn : unit -> 'a

    val main = fn : unit -> unit

`

到目前为止,这是我写的代码:

`

     datatype 'a inflist = NIL

                | CONS of 'a * (unit -> 'a inflist);

     fun HD (CONS(a,b)) = a

              | HD NIL = raise Subscript;

    fun TL (CONS(a,b)) = b()

             | TL NIL = raise Subscript;

    fun NULL NIL = true
             | NULL _ = false;

    fun TAKE(xs, 0) = []

          | TAKE(NIL, n) = raise Subscript

          | TAKE(CONS(x,xf), n) = x::TAKE(xf(), n-1);


     fun FROMN n = CONS (n,fn () => FROMN (n+1));

     val natnumber = FROMN 0;

     fun printGenList f (h::t) = (f h;  printGenList f t);



     fun printList l = printGenList (fn(e) => print(Int.toString(e)^" ")) l;



      fun printPairList l = printGenList (fn(e,f) => print("("^Int.toString(e)^", "^Int.toString(f)^") ")) l;

      CM.make "$cml/cml.cm";
       open CML;

     val chan: int chan = channel();

     fun gen ch () = send (ch, printList(TAKE(natnumber,101)));

      fun printnat ch () = recv (ch);

    fun main () =

    let 

          val ch = channel() :int chan ;

         val _ = spawn (gen ch);

        val _ = spawn (printnat ch); 

  in

       ()

   end;

` 但我没有得到输出。我的语法或逻辑出错了吗? 我是SML和Concurrent ML的新手。请帮帮我。

1 个答案:

答案 0 :(得分:0)

为什么使用无限列表?有更简单的方法来实现这一点。