Afaik the reason you can do
julia> struct Foo end
julia> enumerate(Foo())
enumerate(Foo())
isn’t based on principle since it doesn’t have much (any?) benefit. It’s more just due to the technical reason that Julia hasn’t figured out its trait system yet.
I think Julia’s sparse use of type signatures is a significant problem for correctness, composability, and documentation.
I don’t agree with using
IMO, the solution is likely to be a trait system (like WhereTraits.jl), but there are some significant issues that need to be worked out before such a system can be widely deployed.
A related issue that Julia has is that it can’t currently represent higher order functions in the type system. For example, it’s not currently possible to write a signature for map
. This makes it hard to write more sophisticated functional structures because there’s no help from the compiler and no signatures to guide the author.