I'm happy to be enlightened on this topic, so please jump in and open my mind!
I do not understand the need for dynamic typing over static typing? (I'm talking about static typing in its most simple form, as in Java/C++)
Does anyone know why we would ever want dynamic typing over static typing?
When performing computations we must understand the initial state, such that after performing a computation we can assert the outcome. Ie in a simple case if we were to convert a Fish into a Cat we would need to check that the object we are about to convert into a Cat, is in fact a Fish, because the computation only knows how to convert a Cat into Fish an nothing else. If we did not know the type of the intial object we could simply check its properties too see if it behaves like a Fish, and if it does we can assert it is a Fish, but it would be better to know this upfront as we don't want remember to check for Fish like properties everytime. This is what I see as the difference between dynamic and static typing. With dynamic we have to check the properties everytime where as in static typing, combined with decent invariants, the properties are encapsulated behind the type of the object, e.g. within a class in Java/C++, and on construction/modification of the object we prove that the value is of valid type, then functions can consume typed data with the confidence that checks have already been performed to verify the type. Surely this is better than in dynamic typing where could are free to pass in any value and you have to repeat validity checks in the client code?