Skip to content

Instantly share code, notes, and snippets.

@naoto-ogawa
Last active April 14, 2018 06:35
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save naoto-ogawa/e2565ab4e67ae700889a98e07eef3486 to your computer and use it in GitHub Desktop.
Power of Dots

-- one dot (.)


ghci

> :t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
> :t .

<interactive>:1:1: error: parse error on input ‘.’

-- two dots (.)(.)


(.) :: (b1 ->        c1                    ) -> (a1 -> b1) -> a1 -> c1
(.) :: (b2 -> c2) -> (a2 -> b2) -> a2 -> c2

        b1 = b2 -> c2
        c1 = (a2  -> b2)  -> a2 -> c2

(.)(.) ::
(a1 -> b1        ) -> a1 -> c1
(a1 -> b1        ) -> a1 -> ((a2 -> b2)  -> a2 -> c2)
(a1 -> (b2 -> c2)) -> a1 -> ((a2 -> b2)  -> a2 -> c2)
(a1 -> b2 -> c2  ) -> a1 ->  (a2 -> b2)  -> a2 -> c2

ghci

> :t (.)(.)
(.)(.) :: (a1 -> b -> c) -> a1 -> (a2 -> b) -> a2 -> c

-- three dots (.)(.)(.) = (.).(.)


(.) :: (b1          -> c1                    ) -> (a1 ->         b1                    ) -> a1 -> c1
(.) :: (b2  -> c2) ->  (a2-> b2) -> a2 -> c2
(.) ::                                            (b3  -> c3) -> (a3 -> b3) -> a3 -> c3

       b1 = b2          -> c2
       b1 = (a3 -> b3)  -> a3 -> c3

(.).(.)
(b3 -> c3) -> (a2 -> b2) -> a2 -> c2
(b3 -> c3) -> (a2 -> a3 -> b3) -> a2 -> a3 -> c3 

ghci

> :t (.)(.)(.)
(.)(.)(.) :: (b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c

> :t (.).(.)
(.).(.) :: (b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c

> :t (.)((.)(.))
(.)((.)(.)) :: (a1 -> a2 -> b -> c) -> a1 -> a2 -> (a3 -> b) -> a3 -> c

> :t ((.)(.))(.)
((.)(.))(.) :: (b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c

-- four dots (.)(.)(.)(.) = ((.)(.)(.))(.)


(.)(.)(.) :: (b3         -> c3                    ) -> (a2 -> a3 -> b3) -> a2 -> a3 -> c3 
(.)       :: (b4  -> c4) -> (a4 -> b4) -> a4 -> c4

   b3 = b4 -> c4
   c3 = (a4 -> b4) -> a4 -> c4

(.)(.)(.)(.) ::

(a2 -> a3 -> b3) -> a2 -> a3 -> c3 
(a2 -> a3 -> b4 -> c4) -> a2 -> a3 -> ((a4 -> b4) -> a4 ->c4)
(a2 -> a3 -> b4 -> c4) -> a2 -> a3 ->  (a4 -> b4) -> a4 ->c4

ghci

> :t (.)(.)(.)(.)
(.)(.)(.)(.) :: (a1 -> a2 -> b -> c) -> a1 -> a2 -> (a3 -> b) -> a3 -> c

> :t (.)(.)((.)(.))
(.)(.)((.)(.)) :: (b1 -> b2 -> c) -> (a1 -> b1) -> a1 -> (a2 -> b2) -> a2 -> c

> :t (.)((.)(.)(.))
(.)((.)(.)(.)) :: (a1 -> b -> c) -> a1 -> (a2 -> a3 -> b) -> a2 -> a3 -> c

> :t ((.)(.))(.)(.)
((.)(.))(.)(.) :: (a1 -> a2 -> b -> c) -> a1 -> a2 -> (a3 -> b) -> a3 -> c

> :t ((.)(.)(.))(.)
((.)(.)(.))(.) > a2 -> b -> c) -> a1 -> a2 -> (a3 -> b) -> a3 -> c

-- five dots (.)(.)(.)(.)(.) = ((.)(.)(.))(.)(.)


(.)(.)(.) :: (b3         -> c3                     ) -> (a2         -> a3         -> b3      ) -> a2 -> a3 -> c3 
(.)       :: (b4  -> c4) -> (a4 -> b4) -> a4 -> c4
(.)       ::                                            (b5  -> c5) -> (a5 -> b5) -> a5 -> c5
              b3 = b4 -> c4
                 = a5 -> c5

(.)(.)(.)(.)(.) ::
a2 -> a3 ->c3
(b5 -> c5) -> (a5 -> b5) -> ((a4 -> b4) -> a4 -> c4)
(b5 -> c5) -> (a5 -> b5) -> ((a4 -> a5) -> a4 -> c5)
(b5 -> c5) -> (a5 -> b5) ->  (a4 -> a5) -> a4 -> c5

ghci

> :t (.)(.)(.)(.)(.)
(.)(.)(.)(.)(.) :: (b1 -> c) -> (b2 -> b1) -> (a -> b2) -> a -> c

> :t (.)(.)(.)((.)(.))
(.)(.)(.)((.)(.)) :: (a1 -> a2 -> a3 -> b -> c) -> a1 -> a2 -> a3 -> (a4 -> b) -> a4 -> c

> :t (.)(.)((.)(.)(.))
(.)(.)((.)(.)(.)) :: (b -> c) -> (a1 -> a2 -> a3 -> b) -> a1 -> a2 -> a3 -> c

> :t (.)((.)(.)(.)(.))
(.)((.)(.)(.)(.)) :: (a1 -> a2 -> a3 -> b -> c) -> a1 -> a2 -> a3 -> (a4 -> b) -> a4 -> c

> :t ((.)(.))(.)(.)(.)
((.)(.))(.)(.)(.) :: (b1 -> c) -> (b2 -> b1) -> (a -> b2) -> a -> c

> :t ((.)(.)(.))(.)(.)
((.)(.)(.))(.)(.) :: (b1 -> c) -> (b2 -> b1) -> (a -> b2) -> a -> c

> :t ((.)(.)(.)(.))(.)
((.)(.)(.)(.))(.) :: (b1 -> c) -> (b2 -> b1) -> (a -> b2) -> a -> c

-- five dots (.).(.).(.) = ((.).(.)).(.) = (.)((.).(.))(.)


(.)       :: (b4        -> c4                                ) -> (a4       -> b4                        ) -> (a4 -> c4) 
(.)(.)(.) :: (b3 -> c3) -> (a2 -> a3 -> b3) -> a2 -> a3 -> c3 
(.)       ::                                                       (b5 -> c5) -> (a5 -> b5) -> (a5 -> c5) 
             b4 = b3 -> c3
                = (a5 -> b5) -> (a5 -> c5)

(.).(.).(.) = ((.).(.)).(.) = (.)((.).(.))(.) = (.)((.)(.)(.))(.) ::
(b5 -> c5) -> (a2 -> a3 -> b3) -> a2 -> a3 -> c3 
(b5 -> c5) -> (a2 -> a3 -> a5 -> b5) -> a2 -> a3 -> a5 -> c5 

ghci

> :t (.).(.).(.)
(.).(.).(.) :: (b -> c) -> (a1 -> a2 -> a3 -> b) -> a1 -> a2 -> a3 -> c

> :t (.).((.).(.))
(.).((.).(.)) :: (b -> c) -> (a1 -> a2 -> a3 -> b) -> a1 -> a2 -> a3 -> c

> :t ((.).(.)).(.)
((.).(.)).(.) :: (b -> c) -> (a1 -> a2 -> a3 -> b) -> a1 -> a2 -> a3 -> c

> :t ((.).)(.).(.)
((.).)(.).(.) :: (b -> c) -> (a1 -> a2 -> a3 -> b) -> a1 -> a2 -> a3 -> c

> :t (.).(.)(.(.))
(.).(.)(.(.)) :: (b1 -> ((a1 -> b2) -> a1 -> c1) -> c2) -> (a2 -> b1) -> a2 -> (b2 -> c1) -> c2

-- seven dots (.).(.).(.).(.) = (.).(.).((.).(.))


(.)       :: (b4        -> c4                                ) -> (a4       -> b4                                  ) -> (a4 -> c4) 
(.)(.)(.) :: (b3 -> c3) -> (a2 -> a3 -> b3) -> a2 -> a3 -> c3 
(.)(.)(.) ::                                                       (b7 -> c7) -> (a6 -> a7 -> b7) -> a6 -> a7 -> c7 
             b4 = b3               -> c3
             b4 = (a6 -> a7 -> b7) -> a6 -> a7 -> c7 

(.).(.).(.).(.) = (.).(.).((.).(.)) = ((.).(.)).((.).(.)) = (.)((.).(.))((.).(.)) = (.)((.)(.)(.))((.)(.)(.)) ::
a4 -> c4
(b7 -> c7) -> (a2 -> a3 -> b3) -> a2 -> a3 -> c3 
(b7 -> c7) -> (a2 -> a3 -> a6 -> a7 -> b7) -> a2 -> a3 -> a6 -> a7 -> c7 

ghci

> :t (.).(.).(.).(.)
(.).(.).(.).(.) :: (b -> c) -> (a1 -> a2 -> a3 -> a4 -> b) -> a1 -> a2 -> a3 -> a4 -> c

> :t (.).(.).((.).(.))
(.).(.).((.).(.))       :: (b -> c) -> (a1 -> a2 -> a3 -> a4 -> b) -> a1 -> a2 -> a3 -> a4 -> c

> :t ((.).(.)).((.).(.))
((.).(.)).((.).(.))     :: (b -> c) -> (a1 -> a2 -> a3 -> a4 -> b) -> a1 -> a2 -> a3 -> a4 -> c

> :t (.).((.).((.).(.)))
(.).((.).((.).(.)))     :: (b -> c) -> (a1 -> a2 -> a3 -> a4 -> b) -> a1 -> a2 -> a3 -> a4 -> c

> :t ((.)(.)(.)).((.)(.)(.))
((.)(.)(.)).((.)(.)(.)) :: (b -> c) -> (a1 -> a2 -> a3 -> a4 -> b) -> a1 -> a2 -> a3 -> a4 -> c
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment