0

stackwithを実装したいと思いvalue restrictionます。

私が欲しいのは、poppushが常にまったく同じタイプについて話しているということです。


これが私のsigです。

module type MyStackSig = 
sig

  type 'a stack

  exception EmptyStack

  val create : unit -> 'a stack
  val push : 'a stack -> 'a -> unit
  val pop : 'a stack -> 'a
  val is_empty : 'a stack -> bool
  val size : 'a stack -> int

end;;

このシグニチャは十分value restrictionですか?

つまり、いつも同じタイプについて話しているのでしょうかpushpop

4

1 に答える 1

3

あなたの署名は正しいようです。このタイプは、push と pop が同じスタックを取得する場合、同じコンテンツ タイプを処理することを示しています。stack の型パラメータ 'a がそれを保証します。

let st = create () in
push st 1;
print_string (pop st)

st は値の制限により多相型を持つことができないため、型付けが正しくありませんが、複数の型に使用されます: int スタックおよび文字列スタック: 1 つのスタック st については「同じ型について話していません」。パラメータ タイプは値制限です。

一方、以下は適切に型付けされています。

let st1 = create () in
let st2 = create () in
push st1 1;
print_string (pop st2) (* it should raise EmptyStack, but do not care it here *)

ここで、プッシュとポップは異なるタイプについて話しますが、スタックは異なります。だから、問題ありません。

(リラックスした) 値の制限は強制できるものではありません。あなたはそれと一緒に暮らすことを余儀なくされています。これは、OCaml での副作用の型付けに対する型システムの制限です。

于 2013-02-21T06:14:04.603 に答える