0

我希望实现一个stackwith value restriction

我想要的是popandpush总是在谈论完全相同的类型。


这是我的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吗?

我的意思是会push一直pop在谈论同一种类型吗?

4

1 回答 1

3

您的签名看起来正确。这些类型告诉 push 和 pop 在采用相同堆栈时处理相同的内容类型。stack 的类型参数 'a 确保了这一点。

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

是错误类型的,因为由于值限制,st 不能具有多态类型,但是,它用于不止一种类型:int 堆栈和字符串堆栈:对于一个堆栈 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 *)

在这里,push 和 pop 谈论不同的类型,但涉及不同的堆栈。所以,没问题。

(放松的)价值限制不是你可以强迫的。你被迫忍受它。这是在 OCaml 中键入副作用的类型系统的限制。

于 2013-02-21T06:14:04.603 回答