@@ -8,16 +8,20 @@ module Data.Coyoneda
8
8
, liftCoyonedaTF
9
9
) where
10
10
11
+ import Data.Exists
12
+
11
13
import Control.Comonad
12
14
import Control.Extend
13
15
import Control.Monad.Trans
14
16
15
- newtype Coyoneda f a = Coyoneda (forall i . { k :: i -> a , fi :: f i } )
17
+ newtype CoyonedaF f a i = CoyonedaF { k :: i -> a , fi :: f i }
18
+
19
+ newtype Coyoneda f a = Coyoneda (Exists (CoyonedaF f a ))
16
20
17
21
type Natural f g = forall a . f a -> g a
18
22
19
23
instance functorCoyoneda :: Functor (Coyoneda f ) where
20
- (<$>) f (Coyoneda v ) = Coyoneda v { k = f <<< v.k }
24
+ (<$>) f (Coyoneda e ) = runExists (\( CoyonedaF v) -> coyoneda ( f <<< v.k) v.fi) e
21
25
22
26
instance applyCoyoneda :: (Apply f ) => Apply (Coyoneda f ) where
23
27
(<*>) f g = liftCoyoneda $ lowerCoyoneda f <*> lowerCoyoneda g
@@ -26,32 +30,30 @@ instance applicativeCoyoneda :: (Applicative f) => Applicative (Coyoneda f) wher
26
30
pure = liftCoyoneda <<< pure
27
31
28
32
instance bindCoyoneda :: (Bind f ) => Bind (Coyoneda f ) where
29
- (>>=) (Coyoneda v ) k = liftCoyoneda $ v .fi >>= lowerCoyoneda <<< k <<< v.k
33
+ (>>=) (Coyoneda e ) k = liftCoyoneda $ runExists (\( CoyonedaF v) -> v .fi >>= lowerCoyoneda <<< k <<< v.k) e
30
34
31
35
instance monadCoyoneda :: (Monad f ) => Monad (Coyoneda f )
32
36
33
37
instance monadTransCoyoneda :: MonadTrans Coyoneda where
34
38
lift = liftCoyoneda
35
39
36
40
instance extendCoyoneda :: (Extend w ) => Extend (Coyoneda w ) where
37
- (<<=) f (Coyoneda w ) = liftCoyoneda $ f <<< coyoneda w.k <<= w.fi
41
+ (<<=) f (Coyoneda e ) = runExists (\( CoyonedaF w) -> liftCoyoneda $ f <<< coyoneda w.k <<= w.fi) e
38
42
39
43
instance comonadCoyoneda :: (Comonad w ) => Comonad (Coyoneda w ) where
40
- extract (Coyoneda w ) = w .k $ extract w.fi
44
+ extract (Coyoneda e ) = runExists (\( CoyonedaF w) -> w .k $ extract w.fi) e
41
45
42
46
coyoneda :: forall f a b . (a -> b ) -> f a -> Coyoneda f b
43
- coyoneda k fi = k <$> liftCoyoneda fi
47
+ coyoneda k fi = Coyoneda $ mkExists $ CoyonedaF { k: k, fi: fi }
44
48
45
- -- liftCoyoneda :: forall f a. f a -> Coyoneda f a
46
- -- liftCoyoneda fa = Coyoneda { k: id , fi: fa }
47
- foreign import liftCoyoneda " function liftCoyoneda(fa){return {k: function(a){return a;}, fi: fa};}"
48
- :: forall f a . f a -> Coyoneda f a
49
+ liftCoyoneda :: forall f a . f a -> Coyoneda f a
50
+ liftCoyoneda fa = Coyoneda $ mkExists $ CoyonedaF { k: id, fi: fa }
49
51
50
52
lowerCoyoneda :: forall f a . (Functor f ) => Coyoneda f a -> f a
51
- lowerCoyoneda (Coyoneda v ) = v .k <$> v.fi
53
+ lowerCoyoneda (Coyoneda e ) = runExists (\( CoyonedaF v) -> v .k <$> v.fi) e
52
54
53
55
liftCoyonedaT :: forall f g . Natural f g -> Natural (Coyoneda f ) (Coyoneda g )
54
- liftCoyonedaT nat = \( Coyoneda v) -> Coyoneda v { fi = nat v.fi }
56
+ liftCoyonedaT nat ( Coyoneda e) = runExists (\( CoyonedaF v) -> coyoneda v.k ( nat v.fi)) e
55
57
56
58
liftCoyonedaTF :: forall f g . (Functor g ) => Natural f g -> Natural (Coyoneda f ) g
57
59
liftCoyonedaTF nat = lowerCoyoneda <<< liftCoyonedaT nat
0 commit comments