我希望stack
与value restriction
一起实施。
我想要的是pop
和push
始终在谈论完全相同的类型。
这是我的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
会一直在讨论相同的类型吗?
答案 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中输入副作用是类型系统的限制。