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