Assinatura do tipo incompleta

Vamos dizer que temos uma função como f abaixo, que retorna uma mônada. No entanto, onde você vêInt, finja que é um tipo muito complicado.

f :: (Monad m) => m Int -- Pretend this isn't Int but something complicated
f = return 42

Agora vamos dizer que queremos forçar isso para oMaybe mônada. Nós não precisamos escrever o tipo completo def Para fazer isso, podemos apenas fazer o seguinte:

g :: Maybe a -> Maybe a
g = id

main = print $ (g f)

A função dummyg forçasf tornar-seMaybe.

Eu acho que o acima é bastante confuso. O que eu prefiro escrever é isto:

main = print $ (f :: Maybe a)

Mas falha com o seguinte erro:

Couldn't match expected type `a' against inferred type `Int'
  `a' is a rigid type variable bound by
      the polymorphic type `forall a. Maybe a' at prog.hs:7:16
  Expected type: Maybe a
  Inferred type: Maybe Int
In the second argument of `($)', namely `(f :: Maybe a)'
In the expression: print $ (f :: Maybe a)

Existe uma maneira de fazer o queg acima faz de uma maneira menos confusa que não envolve a criação de uma nova função? Eu não quero escreverf :: Maybe Int, pois se torna um problema de manutenção se o tipo de retorno for alterado. As extensões do GHC estão bem nas respostas.

questionAnswers(2)

yourAnswerToTheQuestion