32

Bug introduced in 9.0 and fixed in 10.0.0


It is not surprising that DeleteDuplicates[{5,5.}] returns {5,5.} because DeleteDuplicates uses SameQ by default, and SameQ[5,5.] is False.

However, Equal[5,5.] is True, but DeleteDuplicates[{5,5.},Equal] still returns {5,5.}.

It is interesting to note that Union works properly, in that Union[{5,5.},SameTest->Equal] returns {5}, as expected.

Is this a bug, or am I missing something? I'm using version 9.

Update:

I realize that using the function #1==#2& will get it working, thanks for pointing this out.

However, my question really is "Is this a bug, or am I missing something?".

To illustrate this further, consider the following:

f[x__]:=Equal[x]
DeleteDuplicates[{5,5.},f]
(* {5} *)

In what capacity are f and Equal different? Or what is leading DeleteDuplicates to treat them differently? They both take an arbitrary number of inputs, which is what I originally thought was the problem.

Mr.Wizard
  • 271,378
  • 34
  • 587
  • 1,371
Ian Hincks
  • 1,859
  • 13
  • 21

2 Answers2

19

As @Albert Retey remarked in a comment, a second argument of (just) Equal leads to a special case handler that, to me, seems overly ambitious. I reported it as a bug.

Daniel Lichtblau
  • 58,970
  • 2
  • 101
  • 199
  • +1 but... raking in rep for confirming bugs may be the wrong incentive, WRI-wise? :-P – Yves Klett Jan 24 '13 at 09:58
  • 2
    My strategy has been to fix bugs/implement features, remain silent for weeks/months, and then miss the rep uptick when the new version ships because sleep started to look better than beating out intrepid explorers for reputation. Maybe I should rethink that... :) – John Fultz Jan 24 '13 at 11:37
  • 1
    @Yves Klett I'm as confused as you. Meanwhile other responses take real work and get maybe 2 upvotes. – Daniel Lichtblau Jan 24 '13 at 15:13
9

You need to use :

DeleteDuplicates[{5, 5.}, Equal[#1, #2] &]
(* {5} *)
b.gates.you.know.what
  • 20,103
  • 2
  • 43
  • 84