OCaml中contains元素判断函数的类型错误问题排查
解决OCaml递归contains函数的类型不匹配错误
问题原因
你的代码逻辑本身是正确的,在线编译器能正常运行也验证了这一点。本地报错的核心原因是初始化文件中加载的camlp4修订语法(#camlp4r;;)干扰了OCaml的类型推断,或是你的OCaml交互环境被之前定义的同名contains函数污染:
- OCaml 4.13.1已不再默认支持camlp4,修订语法会改变OCaml的默认行为,引发类型推断异常
- 若之前在交互环境中定义过接收int类型参数的
contains函数,再次定义时会被旧的类型约束限制
解决方案
调整初始化文件
删除初始化文件中的#camlp4r;;和#camlp4o;;指令——camlp4在新版本OCaml中已被废弃,使用它会带来不必要的兼容性问题。重置交互环境
关闭当前OCaml交互终端,重新启动,确保没有旧的contains函数残留。重新验证代码
在干净的环境中重新输入代码:let rec contains elem l = match l with | a::c -> if (a = elem) then true else (contains elem c) | [] -> false let t = contains "a" ["a"; "b"];;此时应能正常运行,得到
val t : bool = true的结果。
额外说明
如果确实需要使用语法扩展工具,推荐使用OCaml官方主推的ppx系列,而非已废弃的camlp4。
内容的提问来源于stack exchange,提问作者IntegrateThis
相关产品推荐
相关产品推荐

