I wrote about this here:
https://numerics.diploid.ca/numeric-protocols.html#default-implementations-and-unintentional-infinite-recursion