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.