Haskell frustrations

In my two month odyssey to master haskell there have been many frustrations. The type and class extensions in GHC (and other modern haskells) has been an endless source of pain. Documentation is bad and there are infuriating syntactic snags. I spent an hour trying to use runST using the form

runST $ do
    ...

only to discover you can’t use ($) in this situation but must use brackets instead. Why? It doesn’t really make any sense.

I’ve tried to code to work over tuples substituting tuple pairs for the list constructor (:) but the class system just wont work this way

class MaybeTuples r a | r -> a where
    apM :: r -> a

instance MaybeTuples (Maybe a,()) (Maybe a) where
    apM (ma,()) = ma

instance (MaybeTuples mtb b) => MaybeTuples (Maybe a,mtb) (Maybe (a,b)) where
    apM (ma,mb) = do a

It looks good and it should work but it doesn’t. Like difficulties are the inability to declare instances wider than their implementations to catch obvious errors and unify obvious types to their required form. As a result you spend a lot of time typing needlessly repeated code and redundant type signatures.