Answer to question posed on the Yesod mailing list.
Sometimes GHC will complain about not knowing about a type variable. In the example below, the reason is that the behavior of the program depends on specifying that type variable. For example, in someFunction
, the choice of monad will determine the name to be returned.
class Monad m => NamedMonad m where
namedMonad :: m a -> String
instance NamedMonad IO where
namedMonad _ = "IO"
instance NamedMonad Maybe where
namedMonad _ = "Maybe"
someFunction :: NamedMonad m => (String, m Int)
someFunction =
(name, res)
where
name = namedMonad res
res = return $ length name
main :: IO ()
main = do
-- Not ambiguous
let (name1, val1) = someFunction
val1' <- val1
print (name1, val1')
-- Very ambiguous, try commenting out
putStrLn $ fst someFunction
-- But this fixes is
putStrLn $ fst (someFunction :: (String, Maybe Int))