2011-02-25 98 views
3

我想实现一个使用标准ML的CML扩展的并发列表,但我遇到了可能与我是一个标准ML中的新手做的错误。我将clist实现为具有输入和输出通道,并将列表状态存储在一个循环中。但是我的代码无法编译,并给出以下标准的ML/CML错误的操作符 - 操作数错误

structure Clist : CLIST = 
struct 
    open CML 

    datatype 'a request = CONS of 'a | HEAD 

    datatype 'a clist = CLIST of { reqCh : 'a request chan, replyCh : 'a chan } 

    (* create a clist with initial contents l *) 
    val cnil = 
    let 
     val req = channel() 
     val reply = channel() 
     fun loop l = case recv req of 
      CONS x => 
      (loop (x::l)) 
     | 
      HEAD => (send(reply, l); loop l) 
    in 
     spawn(fn() => loop nil); 
     CLIST {reqCh=req,replyCh=reply} 
    end 

    fun cons x (CLIST {reqCh, replyCh})= 
    (send (reqCh, CONS x); CLIST {reqCh = reqCh, replyCh = replyCh}) 

    fun hd (CLIST {reqCh, replyCh}) = (send (reqCh, HEAD); recv replyCh) 
end 

错误,这是签名文件

signature CLIST = 
    sig 
    type 'a clist 

    val cnil : 'a clist 
    val cons : 'a -> 'a clist -> 'a clist 
    val hd : 'a clist -> 'a 
    end 

错误我得到:

clist.sml:21.4-21.35 Error: operator and operand don't agree [circularity] 
    operator domain: {replyCh:'Z list chan, reqCh:'Z list request chan} 
    operand:   {replyCh:'Z list chan, reqCh:'Z request chan} 
    in expression: 
    CLIST {reqCh=req,replyCh=reply} 
+2

哪里CLIST签名?这是你得到的类型错误,所以让它们可用是很好的。主要的问题是你的'头部'操作不会解构我想的列表。 – 2011-02-25 13:32:02

+0

哪一行是33行? – tgdavies 2011-02-25 13:32:36

+0

我只是重申了错误部分,因为我使用的是注释掉的文件,而且行是错误的。我还包括签名 – spydadome 2011-02-25 13:44:13

回答

0

所以你的问题是在你的clist定义

datatype 'a clist = CLIST of { reqCh : 'a request chan, replyCh : 'a chan } 

这就是说请求频道接收到'a的请求并用'a回复。这与您的实施不一致。当您在频道上发送CONS x请求时,您的意思是将'a类型的x添加到列表中,但是当您发送HEAD请求时,您说要将整个列表还给我。因此,CONS请求应采取'aHEAD请求应返回'a list。您可以通过更改clist定义解决您的问题,以

datatype 'a clist = CLIST of { reqCh : 'a request chan, replyCh : 'a list chan } 

我也建议改变你的cnil定义为unit -> 'a clist功能,这样您可以创建不同的并发名单。

例如:

val l1 = Clist.cnil() 
val l2 = Clist.cnil() (*cons'ing onto l2 won't affect l1*) 
+0

您对问题的解释看起来是正确的,但您提出的解决方案似乎对我来说不正确。当然,正确的解决办法是让'HEAD'只返回列表头部?这就是'头部'这个名字所暗含的含义,而'头部'的定义也暗示了'hd'的含义。 (请注意,为了使签名匹配,'hd'必须有''clist - >'a'类型,如果'recv replyCh'具有类型''列表',则不会发生这种情况。) – ruakh 2015-08-17 05:15:47