Funções para tipos de dados polimórficos

dadosFoo a é definido como:

data Foo a where
  Foo :: (Typeable a, Show a) => a -> Foo a
  -- perhaps more constructors

instance Show a => Show (Foo a) where
  show (Foo a) = show a

com algumas instâncias:

fiveFoo :: Foo Int
fiveFoo = Foo 5

falseFoo :: Foo Bool
falseFoo = Foo False

Como posso definir qualquer função deb -> Foo a, por exemplo:

getFoo :: (Show a, Typeable a) => String -> Foo a
getFoo "five" = fiveFoo
getFoo "false" = falseFoo

AquigetFoo não digita cheque comCouldn't match type ‘a’ with ‘Bool’.

A única coisa que me interessa aqui é paraa ser de classeShowpara que eu possa usargetFoo gostar:

main = getLine >>= (print . getFoo)

questionAnswers(3)

yourAnswerToTheQuestion