Функции для полиморфных типов данных
данные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)