the main benefit is catching errors early
Dynamic typing isn't about not specifying types. Dynamic typing is about creating types at runtime.This enables certain techniques that are very productive, and totally different from what you would do in a language like Haskell, which does have full-type inference.
I also do not think a static language would work as a client-side in-browser language, simply because of the nature of browsers and the web. Such a language needs runtime introspection and even types created at runtime like air. For in-browser stuff I also prefer eval() over static-typing any day of the week.
eval() is shown to be usable in a static typing environment by some of Don Stewart's papers, though it does take more effort on the language implementors' side.
Reflection is achieved in Haskell, for example, using reflective type-classes (such as Typeable and Data).
Above should read: "There's no real conflict"
[1] https://docs.djangoproject.com/en/dev/ref/contrib/admin/#dja... [2] http://clojure.github.com/clojure/clojure.core-api.html#cloj... [3] http://clojure.github.com/clojure/clojure.core-api.html#cloj...
I'm not sure what Proxy is used for -- but it sounds like Template Haskell can probably implement it?
defrecord seems like it refers to defining new types at runtime -- which is also possible via either late type-check or Template Haskell.
String | `a < SimpleListFilter | (String, `b < FieldListFilter)
Now, this type is certainly encodable in a modern advanced type system (although most statically typed languages utilize type erasure for compilation, so you would need tagged unions (Algebraic Data Types) for this), but I cannot imagine that any language is capable of inferring such a type. Maybe OCaml, but again, we would need polymorphic variants for that.