Funktionen zu polymorphen Datentypen
DatenFoo a
ist wie folgt definiert:
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
mit einigen Instanzen:
fiveFoo :: Foo Int
fiveFoo = Foo 5
falseFoo :: Foo Bool
falseFoo = Foo False
Wie kann ich eine Funktion aus @ definiereb -> Foo a
, zum Beispiel
getFoo :: (Show a, Typeable a) => String -> Foo a
getFoo "five" = fiveFoo
getFoo "false" = falseFoo
HiergetFoo
gibt keinen Scheck mit @ eCouldn't match type ‘a’ with ‘Bool’
.
Das einzige, was mich hier interessiert, ist füra
Klasse seinShow
so kann ich @ verwendgetFoo
mögen
main = getLine >>= (print . getFoo)