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.