Interesting about Elixir. I will have to look at it.
I think the rejection of static typing is more of a reaction to overly verbose syntax, such as Java’s requirement (since relaxed) that one do things like,
MyClass c = new MyClass();
forcing someone to type “MyClass” twice.
On the other hand, I rarely do that: I almost always use an interface type on the left, and a concrete type on the right…
I think that the prototyping argument is valid. A possible solution, which I have used in the Flow language (which I defined), is to allow someone to define new types inline, as extensions to existing types. Java allows that too, but you cannot name the inline types, but in Flow you can.
I am intrigued by the Elixir struct. Thanks for the pointer to it!