如何在OCaml中强制限制价值?

时间:2013-02-20 22:37:05

标签: functional-programming ocaml

我希望stackvalue 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会一直在讨论相同的类型吗?

1 个答案:

答案 0 :(得分:3)

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

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

是类型错误的,因为st由于值限制而不能具有多态类型,但是,它用于多种类型:int stack和string stack:"它们不会讨论相同的类型&# 34;对于一个堆栈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中输入副作用是类型系统的限制。