Comparing a statically typed language to a dynamically typed language is silly when talking about type signatures. Of course you don't have type annotations in Ruby, it's a dynamic language. But it also means you don't get compile-time guarantees.
Ask yourself what would be the type signature of a similar function in another statically typed language. You have a parametrized type with three parameters, which would give you something like:
MForm<Blog, Blog, SomeFormResultWithWidget>
And SomeFormResultWithWidget would have to be defined elsewhere. I'm not convinced it's clearer than the Haskell version. And you could easily remove the verbosity of the Haskell version with a type alias.
Ask yourself what would be the type signature of a similar function in another statically typed language. You have a parametrized type with three parameters, which would give you something like:
And SomeFormResultWithWidget would have to be defined elsewhere. I'm not convinced it's clearer than the Haskell version. And you could easily remove the verbosity of the Haskell version with a type alias.