! , Haskell98, GHC.
Thing, , Foo.
{-# LANGUAGE ExistentialQuantification #-}
class Foo g where
f :: g -> Int
data Foo1 = Foo1 { f1 :: Int }
instance Foo (Foo1) where f = f1
data Thing = forall a . Foo a => Thing a
bar :: Thing -> Int
bar (Thing t) = f t
. " ":
https://en.wikibooks.org/wiki/Haskell/Existentially_quantified_types
1:
FooN, , , . , , FooThing Thing, , , FooThing
{-# LANGUAGE ExistentialQuantification #-}
class Foo g where
f :: g -> Int
data Foo1 = Foo1 { f1 :: Int }
instance Foo (Foo1) where f = f1
data Thing = Thing1 Foo1
data FooThing = forall a . Foo a => FooThing a
fooThing :: Thing -> FooThing
fooThing (Thing1 t) = FooThing t
bar :: Thing -> Int
bar = g . fooThing
where g (FooThing t) = f t
Foo Thing
instance Foo (Thing) where
f = g . fooThing
where g (FooThing t) = f t
2:
shang, GADT, , , Thing Foo1 `` `Foo``,
{-# LANGUAGE GADTs #-}
class Foo g where
f :: g -> Int
data Foo1 = Foo1 { f1 :: Int }
instance Foo (Foo1) where f = f1
data Thing where
Thing :: Foo t => t -> Thing
bar :: Thing -> Int
bar (Thing foo) = f foo