Tipo de firma incompleta

Digamos que tenemos una función como f a continuación, que devuelve una mónada. Sin embargo, donde se veInt, pretender que es un tipo realmente complicado.

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

Ahora digamos que queremos forzar esto en elMaybe monada. No necesitamos escribir el tipo completo def Para hacer esto, podemos hacer lo siguiente:

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

main = print $ (g f)

La función ficticiag efectivof convertirseMaybe.

Creo que lo anterior es más bien desordenado. Lo que preferiría escribir es esto:

main = print $ (f :: Maybe a)

Pero falla con el siguiente error:

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)

¿Hay una manera de hacer lo queg ¿Lo anterior lo hace de una manera menos complicada que no implica crear una nueva función? No quiero escribirf :: Maybe Int, ya que se convierte en un problema de mantenimiento si el tipo de retorno cambia. Las extensiones de GHC están bien en las respuestas.

Respuestas a la pregunta(2)

Su respuesta a la pregunta