OCaml中' '=' '判断无法编译报类型错误是什么原因?
问题产生原因
你遇到的类型报错是Core库的默认语法替换导致的:
OCaml标准库默认提供的=是多态比较运算符,可以直接比较char、string等任意基础类型,但Core库为了避免多态比较带来的性能损耗和未定义行为问题,会在你open Core之后默认覆盖标准库的=运算符,替换为仅支持int类型比较的版本,因此直接用它比较char类型的值就会触发「char类型不符合int预期」的报错。
解决办法
- 方案1:使用Core提供的对应类型专用比较函数,char类型可以用
Char.equal,修改代码如下:
let foo () = if Char.equal '\n' '\n' then begin print_endline "foo"; end
- 方案2:局部使用Core的Poly模块启用多态比较,修改代码如下:
let foo () = if Poly.( '\n' = '\n' ) then begin print_endline "foo"; end
- 方案3:如果项目中大量用到多态比较不想逐行修改,可以在引入Core时直接导入Poly模块覆盖Core的比较运算符定义,将代码顶部的
open Core修改为:
open Core open Poly
也可以在引入Core时指定排除比较运算符的覆盖:
open Core without (=, <>, <, >, <=, >=)
内容的提问来源于stack exchange,提问作者geckos
相关产品推荐
相关产品推荐

