OCaml中Stack.push触发类型错误的原因及解决方法
OCaml Stack 类型错误原因及解决方法
哈哈,这个坑我刚入门OCaml的时候也踩过!咱们一步步拆解问题:
错误原因解析
先看你写的第一行代码:
# let s = Stack.create ;; val s : unit -> 'a Stack.t = <fun>
这里的s并没有绑定成一个栈实例,而是绑定了生成栈的函数本身!Stack.create的类型是unit -> 'a Stack.t,意思是它需要接收一个unit类型的值(也就是()),才能返回一个真正的栈对象。
而当你执行Stack.push 1 s时,Stack.push的第一个参数是要推入的元素,第二个参数需要是栈实例(比如int Stack.t类型),但你传的s是一个函数(类型是unit -> 'a Stack.t),类型完全不匹配,所以OCaml就抛出了类型错误。
正确操作方式
你需要调用Stack.create函数,给它传一个()(unit值)来生成栈实例:
# let s = Stack.create ();; val s : '_weak1 Stack.t = <abstr>
现在s就是一个真正的栈了,接下来再执行push操作就没问题:
# Stack.push 1 s;; - : unit = () # Stack.top s;; // 验证一下栈顶元素 - : int = 1
补充说明
OCaml里没有“无参函数”的概念,所有函数都需要至少一个参数。对于那些逻辑上不需要输入的函数,就用unit类型(())作为占位参数,这是OCaml的惯用写法。你看到的示例里肯定是带了()的,可能是你没注意到这个细节~
内容的提问来源于stack exchange,提问作者Tomi Savolainen
相关产品推荐
相关产品推荐

