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))