Sometimes precision of a certain variety is useful for thinking out a program's design. When writing Haskell code, I will often write out the "obvious" parts as well as the types I think will be appropriate for the smaller, less obvious parts. You can define the type but leave the implementation undefined. Whether or not this typechecks tells me if I'm on the right path.