2011-02-27 6 views
2

こんにちは私はなぜこのコードで値の制限エラーが発生しているのか、また可能ならば解決できる方法を理解するのに役立つ必要があります。標準ml値の制限エラー

特にval cnilでは、署名と一致する空のCLIST構造を作成しようとしていますが、この値の制限エラーが続きます。ここで任意のヘルプ

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 *) 
    val cnil = 
    let 
     val reqCh = channel() 
     val replyCh = channel() 
     fun loop l = case recv reqCh of 
      CONS x => 
      (loop (x::l)) 
     | 
      HEAD => (let fun head (h::t) = h | head [] = Empty in send(replyCh, head(l)) end ; loop l) 
    in 
     spawn(fn() => loop nil); 
     CLIST {reqCh = channel(), replyCh = channel() } 
    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:10.7-22.5 Warning: type vars not generalized because of 
    value restriction are instantiated to dummy types (X1,X2,...) 
clist.sml:1.1-29.4 Error: value type in structure doesn't match signature spec 
    name: cnil 
    spec: 'a ?.Clist.clist 
    actual: ?.X1 ?.Clist.clist 
+0

私は、このリンクは思います作業。私は確信していませんが、あなたが[val cnil: 'リスト]を[val cnil:unit - >'リスト]に変更して(それに応じて実装を書き換えると)コンパイラが不平を言い止めるように思えます。 –

答えて

1

はあなたのコードには二つの問題があります。 。一つは、あなたは第二の問題は、CNILということです

fun cnil() = 

val cnil : unit -> 'a clist 

val cnil = 

val cnil : 'a clist 

を変更することで修正することができます値の制限エラーです何もしていないようだ - パーヘッド機能はEmptyを返すのではなくEmptyを返すので、あなたはそれを冗長化しましたか?ベーシスライブラリにはこれを行うhd関数がすでにあります。 clist型は、データ型である必要はありません。私が何をしたいことは、このだと思う:あなたのコードがない理由http://users.cis.fiu.edu/~smithg/cop4555/valrestr.htmlあなたのアイデアを与える必要があります。

structure Clist : CLIST = 
struct 
    open CML 

    datatype 'a request = CONS of 'a | HEAD 

    type 'a clist = { reqCh : 'a request chan, replyCh : 'a chan } 

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


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

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