Generics are about encoding supplemental bits of information in the type system. That information has to be spelled out somewhere
I see why Haskell folks like their type level functions.
Nowadays the editor would help you do that. When I'm coding Rust the editor shows the types inline in a small font, which is very helpful.