Функции для полиморфных типов данных

данныеFoo a определяется как:

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

с некоторыми случаями:

fiveFoo :: Foo Int
fiveFoo = Foo 5

falseFoo :: Foo Bool
falseFoo = Foo False

Как я могу определить любую функцию изb -> Foo a, например:

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

ВотgetFoo не проверяет тип сCouldn't match type ‘a’ with ‘Bool’.

Единственное, что меня здесь интересует, это дляa быть класснымShowтак что я могу использоватьgetFoo лайк:

main = getLine >>= (print . getFoo)

Ответы на вопрос(3)

Ваш ответ на вопрос