シグネチャで多形参照定数を定数にする方法はありますか?シグネチャ内のSML多型参照
このコードはコンパイルが、私は必要なものではありません。
signature NAME = sig
type 'a name
val empty : 'a name
end
structure Name :> NAME = struct
datatype 'a name = Nil | Val of 'a
val empty = Nil
end
は、必要な参照を追加:
signature NAME = sig
type 'a name
val empty : 'a name ref
end
structure Name :> NAME = struct
datatype 'a name = Nil | Val of 'a
val empty = ref Nil
end
は、次のエラーを生成します:
error: Structure does not match signature.
Signature: val empty: 'a name ref
Structure: val empty: 'a name ref
Reason: Can't match 'a to 'a (Type variable is free in surrounding scope)
Found near struct datatype 'a name = Nil | Val of 'a val empty = ref Nil end
ありがとうございます!私は 'datatype'がname = Nil | 'val h = ref:val = h:= Val 5'のValはエラーを生成しませんが、これは次のようになります: 'datatype 'a name = Nil | val of 'val h = ref Nil; val _ = h:= Val 5'(セミコロンに気付く) – zlotnleo
@zlotnleo:ようこそ!なぜセミコロンが違いを生むのか - 標準ML *の定義は、コンパイラが 'empty = ref Nil'のような非一般化可能なバインディングの宣言をどのように扱うべきかは実際には言いません。あなたのコンパイラは、バインディングの種類を「ハング」して、空の型を推論できるように、より多くの情報を得るのを待っているようです。セミコロン(最上位の宣言を終了する)に達すると、コンパイラは明らかにそれを断念します(エラーを返すか、デフォルトまたはダミーの型を割り当てるなど)。 – ruakh