How can we maintain easy generics in the face of demand for a “safe” language?

Actually WhereTraits.jl looks even better for this. You can literally just do

@traits f(x) where {applicable(print, x)} = ...

and it will dispatch depending on that boolean condition.

However the downside is this is not zero-overhead whereas SimpleTraits.jl is.

(Although WhereTraits allows multiple traits; SimpleTraits only permits one)