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

Concurrency 生成自然数并在并发ML中使用2个通信服务器打印它们,concurrency,sml,smlnj,ml,Concurrency,Sml,Smlnj,Ml,我有一个作业,我需要写两个通信服务器,一个生成自然数,另一个打印它们。生成服务器将发送到打印服务器。服务器应该通过共享通道进行通信。主功能应该为每个服务器生成一个线程 ` ` 到目前为止,这是我写的代码: ` ` 但是我没有得到输出。我的语法或逻辑有问题吗? 我是SML和并发ML的新手。请帮助我。为什么要使用无限列表?有更简单的方法来实现这一点。您是否阅读了中的第4项?是的,我尝试了另一种方法,但仍然出现错误CM.make“$cml/cml.CM”;开放性慢性粒细胞白血病;val chan:in

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

`

`

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

`

` 但是我没有得到输出。我的语法或逻辑有问题吗?
我是SML和并发ML的新手。请帮助我。

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

您是否阅读了中的第4项?是的,我尝试了另一种方法,但仍然出现错误CM.make“$cml/cml.CM”;开放性慢性粒细胞白血病;val chan:int chan=channel();fun sender i=if(iHmmm,我在您的程序中看到一些问题。fun receiver R=recv(chan);R是您应该使用的函数的一个参数fun receiver=Let val b=recv(chan);in send(……剩余代码。您使用它的方式是receiver需要一个参数。
    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;