When did Core remove polymorphic comparison operators in recent OCaml?


I’m using the Core library in a project, and recently when I upgraded my OCaml from 4.08.1 to 4.10.0, plenty of compilation errors suddenly appear for comparison expressions like:
if (xs = []) then ... or if (x = true) then ...

I saw that this change was discussed in this thread about monomorphic comparison operators in Base, but did not expect that Core would make it a default behavior.

So I’d like to ask since which version that Core removed such polymorphic comparison operators?
(I couldn’t find it in release notes of Core)

Also, if I define a sum type like type ternary = True | False | Unkn, what will be a correct way to write if (x = True) then ... (which is allowed in the new Core)?

I can temporarily fix by writing if (x == True) then ..., but using == doesn’t seem correct, since == is about comparing physical objects…

Thanks for spending your time to check my question.

1 Like

The change was announced in [ANN] v0.13 release of Jane Street packages, although unfortunately it doesn’t look like the CHANGES.md file was updated in the repo. I would consider the thread to be the canonical announcement.

Here’s a few suggestions:

  1. Define equality/compare functions using ppx_compare
type ternary = True | False | Unkn [@@deriving equal]

let f x = if (equal_ternary x True) then ...
  1. Define equality/compare functions manually
let equal_ternary t1 t2 =
  match t1, t2 with
  | True, True | False, False | Unkn, Unkn -> true
  | _ -> false
  1. Explicitly request polymorphic comparison operators using the Poly module:
let f x = if (Poly.(=) x True) then ...

@bbc2: Thank you very much for the reference and the suggestions! :+1:


should be: [@@deriving eq]

That depends on which preprocessor you are using. [@@deriving equal] comes from ppx_compare, whereas [@@deriving eq] comes from ppx_deriving. Base/Core and the like have better support for the former, which is a Jane Street project, although you can feel free to use the latter—the naming conventions are different, so it may not be as convenient.

1 Like

Actually, I see now that [@@deriving eq] defines a function called equal_ternary, so I guess the names do, in fact, match, so they would probably be interchangeable.

1 Like

Ah, thanks for the information. I wasn’t aware that there are two ppx that could produce equal.