commit 60135c86970a5ad0117afe51396bf7d9ff43a54c Author: Yann Esposito (Yogsototh) Date: Thu Feb 28 16:49:12 2013 +0100 initial commit see my ykeynote repo for history diff --git a/categories.html b/categories.html new file mode 100644 index 0000000..e40a038 --- /dev/null +++ b/categories.html @@ -0,0 +1,1119 @@ + + + + + + + + Category Theory for Programming + + + + + + + + + + + + + + + + + + + + + + + + + +
+\(\newcommand{\F}{\mathbf{F}}\) +\(\newcommand{\E}{\mathbf{E}}\) +\(\newcommand{\C}{\mathcal{C}}\) +\(\newcommand{\D}{\mathcal{D}}\) +\(\newcommand{\id}{\mathrm{id}}\) +\(\newcommand{\ob}[1]{\mathrm{ob}(#1)}\) +\(\newcommand{\hom}[1]{\mathrm{hom}(#1)}\) +\(\newcommand{\Set}{\mathbf{Set}}\) +\(\newcommand{\Mon}{\mathbf{Mon}}\) +\(\newcommand{\Vec}{\mathbf{Vec}}\) +\(\newcommand{\Grp}{\mathbf{Grp}}\) +\(\newcommand{\Rng}{\mathbf{Rng}}\) +\(\newcommand{\ML}{\mathbf{ML}}\) +\(\newcommand{\Hask}{\mathbf{Hask}}\) +\(\newcommand{\Cat}{\mathbf{Cat}}\) +\(\newcommand{\fmap}{\mathtt{fmap}}\) +
+ + + +
+
+

Category Theory & Programming

+
for Rivieria Scala Clojure (Note this presentation uses Haskell)
+by Yann Esposito +
+ + @yogsototh, + + + +yogsototh + +
+
+
ENTER FULLSCREEN
+ HTML presentation: use arrows, space, swipe to navigate. +
+
+
+
+

Plan

+ +
+
+

Not really about: Cat & glory

+
+Cat n glory
credit to Tokuhiro Kawai (川井徳寛)
+
+ + +
+
+

General Overview

+
+Samuel Eilenberg Saunders Mac Lane +
+ +

Recent Math Field
1942-45, Samuel Eilenberg & Saunders Mac Lane

+

Certainly one of the more abstract branches of math

+ +

+★: When is one thing equal to some other thing?, Barry Mazur, 2007
☆: Physics, Topology, Logic and Computation: A Rosetta Stone, John C. Baez, Mike Stay, 2009 +

+ + +
+
+

From a Programmer perspective

+
+

Category Theory is a new language/framework for Math

+
+ +
+
+

Math Programming relation

+Buddha Fractal +

Programming is doing Math

+

Strong relations between type theory and category theory.

+

Not convinced?
Certainly a vocabulary problem.

+

One of the goal of Category Theory is to create a homogeneous vocabulary between different disciplines.

+
+
+

Vocabulary

+mind blown +

Math vocabulary used in this presentation:

+
+

Category, Morphism, Associativity, Preorder, Functor, Endofunctor, Categorial property, Commutative diagram, Isomorph, Initial, Dual, Monoid, Natural transformation, Monad, Klesli arrows, κατα-morphism, ...

+
+
+
+

Programmer Translation

+lolcat + + + + + + + + +
+Mathematician + +Programmer +
+Morphism + +Arrow +
+Monoid + +String-like +
+Preorder + +Acyclic graph +
+Isomorph + +The same +
+Natural transformation + +rearrangement function +
+Funny Category + +LOLCat +
+ + +
+
+

Plan

+ +
+
+

Category

+ +

A way of representing things and ways to go between things.

+ +

A Category \(\mathcal{C}\) is defined by:

+ +
+
+

Category: Objects

+ +objects + +

\(\ob{\mathcal{C}}\) is a collection

+
+
+

Category: Morphisms

+ +morphisms + +

\(A\) and \(B\) objects of \(\C\)
+\(\hom{A,B}\) is a collection of morphisms
+\(f:A→B\) denote the fact \(f\) belongs to \(\hom{A,B}\)

+

\(\hom{\C}\) the collection of all morphisms of \(\C\)

+
+
+

Category: Composition

+

Composition (∘): associate to each couple \(f:A→B, g:B→C\) + $$g∘f:A\rightarrow C$$ +

+composition +
+
+

Category laws: neutral element

+

for each object \(X\), there is an \(\id_X:X→X\),
+such that for each \(f:A→B\):

+identity +
+
+

Category laws: Associativity

+

Composition is associative:

+associative composition +
+
+

Commutative diagrams

+ +

Two path with the same source and destination are equal.

+
+ Commutative Diagram (Associativity) +
+ \((h∘g)∘f = h∘(g∘f) \) +
+
+
+ Commutative Diagram (Identity law) +
+ \(id_B∘f = f = f∘id_A \) +
+
+
+
+

Question Time!

+ +
+ +
+- French-only joke - +
+
+
+
+

Can this be a category?

+

\(\ob{\C},\hom{\C}\) fixed, is there a valid ∘?

+
+ Category example 1 +
+ YES +
+
+
+ Category example 2 +
+ no candidate for \(g∘f\) +
NO +
+
+
+ Category example 3 +
+ YES +
+
+
+
+

Can this be a category?

+
+ Category example 4 +
+ no candidate for \(f:C→B\) +
NO +
+
+
+ Category example 5 +
+ \((h∘g)∘f=\id_B∘f=f\)
+ \(h∘(g∘f)=h∘\id_A=h\)
+ but \(h≠f\)
+ NO +
+
+
+
+

Categories Examples

+ +
+Basket of cats +
+- Basket of Cats - +
+
+
+
+

Category \(\Set\)

+ + + + +
+
+

Categories Everywhere?

+Cats everywhere + +
+
+

Smaller Examples

+ +

Strings

+Monoids are one object categories + + +
+
+

Finite Example?

+ +

Graph

+
+Each graph is a category +
+ + +
+
+

Number construction

+ +

Each Numbers as a whole category

+Each number as a category +
+
+

Degenerated Categories: Monoids

+ +Monoids are one object categories +

Each Monoid \((M,e,⊙): \ob{M}=\{∙\},\hom{M}=M,\circ = ⊙\)

+

Only one object.

+

Examples:

+ +
+
+

Degenerated Categories: Preorders \((P,≤)\)

+ + + +

At most one morphism between two objects.

+ +preorder category +
+
+

Degenerated Categories: Discrete Categories

+ +Any set can be a category +

Any Set

+

Any set \(E: \ob{E}=E, \hom{x,y}=\{x\} ⇔ x=y \)

+

Only identities

+
+
+

Choice

+

The same object can be seen in many different way as a category.

+

You can choose what are object, morphisms and composition.

+

ex: Str and discrete(Σ*)

+
+
+

Categorical Properties

+ +

Any property which can be expressed in term of category, objects, morphism and composition.

+ + +
+
+

Isomorph

+

isomorph cats isomorphism: \(f:A→B\) which can be "undone" i.e.
\(∃g:B→A\), \(g∘f=id_A\) & \(f∘g=id_B\)
in this case, \(A\) & \(B\) are isomorphic.

+

A≌B means A and B are essentially the same.
In Category Theory, = is in fact mostly .
For example in commutative diagrams.

+
+
+

Functor

+ +

A functor is a mapping between two categories. +Let \(\C\) and \(\D\) be two categories. +A functor \(\F\) from \(\C\) to \(\D\):

+ +
+
+

Functor Example (ob → ob)

+ +Functor +
+
+

Functor Example (hom → hom)

+ +Functor +
+
+

Functor Example

+ +Functor +
+
+

Endofunctors

+ +

An endofunctor for \(\C\) is a functor \(F:\C→\C\).

+Endofunctor +
+
+

Category of Categories

+ + + +

Categories and functors form a category: \(\Cat\)

+ +
+
+

Plan

+ +
+
+

Hask

+ +

Category \(\Hask\):

+ +Haskell Category Representation + + + +

Forget glitches because of undefined.

+
+
+

Haskell Kinds

+

In Haskell some types can take type variable(s). Typically: [a].

+

Types have kinds; The kind is to type what type is to function. Kind are the types for types (so meta).

+
Int, Char :: *
+[], Maybe :: * -> *
+(,), (->) :: * -> * -> *
+[Int], Maybe Char, Maybe [Int] :: *
+
+
+

Haskell Types

+

Sometimes, the type determine a lot about the function:

+
fst :: (a,b) -> a -- Only one choice
+snd :: (a,b) -> b -- Only one choice
+f :: a -> [a]     -- Many choices
+-- Possibilities: f x=[], or [x], or [x,x] or [x,...,x]
+
+? :: [a] -> [a] -- Many choices
+-- can only rearrange: duplicate/remove/reorder elements
+-- for example: the type of addOne isn't [a] -> [a]
+addOne l = map (+1) l
+-- The (+1) force 'a' to be a Num.
+ +

+

★:Theorems for free!, Philip Wadler, 1989

+
+
+

Haskell Functor vs \(\Hask\) Functor

+ +

A Haskell Functor is a type F :: * -> * which belong to the type class Functor ; thus instantiate +fmap :: (a -> b) -> (F a -> F b). + +

& F: \(\ob{\Hask}→\ob{\Hask}\)
& fmap: \(\hom{\Hask}→\hom{\Hask}\) + +

The couple (F,fmap) is a \(\Hask\)'s functor if for any x :: F a:

+ +
+
+

Haskell Functors Example: Maybe

+ +
data Maybe a = Just a | Nothing
+instance Functor Maybe where
+    fmap :: (a -> b) -> (Maybe a -> Maybe b)
+    fmap f (Just a) = Just (f a)
+    fmap f Nothing = Nothing
+
fmap (+1) (Just 1) == Just 2
+fmap (+1) Nothing  == Nothing
+fmap head (Just [1,2,3]) == Just 1
+
+
+

Haskell Functors Example: List

+ +
instance Functor ([]) where
+	fmap :: (a -> b) -> [a] -> [b]
+	fmap = map
+
fmap (+1) [1,2,3]           == [2,3,4]
+fmap (+1) []                == []
+fmap head [[1,2,3],[4,5,6]] == [1,4]
+
+
+

Haskell Functors for the programmer

+

Functor is a type class used for types that can be mapped over.

+ +
+
+

Haskell Functor intuition

+ +

Put normal function inside a container. Ex: list, trees...

+ +Haskell Functor as a box play +

+
+

Haskell Functor properties

+ +

Haskell Functors are:

+ + +
+
+

Functor as boxes

+ +

Haskell functor can be seen as boxes containing all Haskell types and functions. +Haskell types is fractal:

+ +Haskell functor representation +
+
+

Functor as boxes

+ +

Haskell functor can be seen as boxes containing all Haskell types and functions. +Haskell types is fractal:

+ +Haskell functor representation +
+
+

Functor as boxes

+ +

Haskell functor can be seen as boxes containing all Haskell types and functions. +Haskell types is fractal:

+ +Haskell functor representation +
+
+

"Non Haskell" Hask's Functors

+

A simple basic example is the \(id_\Hask\) functor. It simply cannot be expressed as a couple (F,fmap) where

+ +

Another example:

+ +
+
+

Also Functor inside \(\Hask\)

+

\(\mathtt{[a]}∈\ob{\Hask}\) but is also a category. Idem for Int.

+

length is a Functor from the category [a] to the category Int:

+ +

+ +
+ +
+
+

Category of \(\Hask\) Endofunctors

+Category of Hask endofunctors +
+
+

Category of Functors

+

If \(\C\) is small (\(\hom{\C}\) is a set). All functors from \(\C\) to some category \(\D\) form the category \(\mathrm{Func}(\C,\D)\).

+ +

\(\mathrm{Func}(\C,\C)\) is the category of endofunctors of \(\C\).

+
+
+

Natural Transformations

+

Let \(F\) and \(G\) be two functors from \(\C\) to \(\D\).

+

Natural transformation commutative diagram A natural transformation: familly η ; \(η_X\in\hom{\D}\) for \(X\in\ob{\C}\) s.t.

+

ex: between Haskell functors; F a -> G a
Rearragement functions only.

+
+ + +
+

Natural Transformation Examples (1/4)

+
data List a = Nil | Cons a (List a)
+toList :: [a] -> List a
+toList [] = Nil
+toList (x:xs) = Cons x (toList xs)
+ +

toList is a natural transformation. It is also a morphism from [] to List in the Category of \(\Hask\) endofunctors.

+natural transformation commutative diagram +
+natural transformation commutative diagram +
+
+
+

Natural Transformation Examples (2/4)

+
data List a = Nil | Cons a (List a)
+toHList :: List a -> [a]
+toHList Nil = []
+toHList (Cons x xs) = x:toHList xs
+ +

toHList is a natural transformation. It is also a morphism from List to [] in the Category of \(\Hask\) endofunctors.

+natural transformation commutative diagram +
+natural transformation commutative diagram
toList . toHList = id & toHList . toList = id &
therefore [] & List are isomorph.
+
+
+
+

Natural Transformation Examples (3/4)

+
toMaybe :: [a] -> Maybe a
+toMaybe [] = Nothing
+toMaybe (x:xs) = Just x
+ +

toMaybe is a natural transformation. It is also a morphism from [] to Maybe in the Category of \(\Hask\) endofunctors.

+natural transformation commutative diagram +
+natural transformation commutative diagram +
+ + +
+
+

Natural Transformation Examples (4/4)

+
mToList :: Maybe a -> [a]
+mToList Nothing = []
+mToList Just x  = [x]
+ +

toMaybe is a natural transformation. It is also a morphism from [] to Maybe in the Category of \(\Hask\) endofunctors.

+natural transformation commutative diagram +
+relation between [] and Maybe
There is no isomorphism.
Hint: Bool lists longer than 1.
+
+ + +
+
+

Composition problem

+

The Problem; example with lists:

+
f x = [x]       ⇒ f 1 = [1]   ⇒ (f.f) 1 = [[1]] ✗
+g x = [x+1]     ⇒ g 1 = [2]   ⇒ (g.g) 1 = ERROR [2]+1 ✗
+h x = [x+1,x*3] ⇒ h 1 = [2,3] ⇒ (h.h) 1 = ERROR [2,3]+1 ✗ 
+ +

The same problem with most f :: a -> F a functions and functor F.

+
+
+

Composition Fixable?

+

How to fix that? We want to construct an operator which is able to compose:

+

f :: a -> F b & g :: b -> F c.

+

More specifically we want to create an operator ◎ of type

+

◎ :: (b -> F c) -> (a -> F b) -> (a -> F c)

+

Note: if F = I, ◎ = (.).

+
+
+

Fix Composition (1/2)

+

Goal, find: ◎ :: (b -> F c) -> (a -> F b) -> (a -> F c)
f :: a -> F b, g :: b -> F c:

+ +
+
+

Fix Composition (2/2)

+

Goal, find: ◎ :: (b -> F c) -> (a -> F b) -> (a -> F c)
f :: a -> F b, g :: b -> F c, f x :: F b:

+ +
+
+

Necessary laws

+

For ◎ to work like composition, we need join to hold the following properties:

+ +
+
+

Klesli composition

+

Now the composition works as expected. In Haskell ◎ is <=< in Control.Monad.

+

g <=< f = \x -> join ((fmap g) (f x))

+
f x = [x]       ⇒ f 1 = [1]   ⇒ (f <=< f) 1 = [1] ✓
+g x = [x+1]     ⇒ g 1 = [2]   ⇒ (g <=< g) 1 = [3] ✓
+h x = [x+1,x*3] ⇒ h 1 = [2,3] ⇒ (h <=< h) 1 = [3,6,4,9] ✓
+ + +
+
+

We reinvented Monads!

+

A monad is a triplet (M,⊙,η) where

+ +

Satisfying

+ +
+
+

Compare with Monoid

+

A Monoid is a triplet \((E,∙,e)\) s.t.

+ +

Satisfying

+ +
+
+

Monads are just Monoids

+
+

A Monad is just a monoid in the category of endofunctors, what's the problem?

+
+

The real sentence was:

+
+

All told, a monad in X is just a monoid in the category of endofunctors of X, with product × replaced by composition of endofunctors and unit set by the identity endofunctor.

+
+
+
+

Example: List

+ +
-- In Haskell ⊙ is "join" in "Control.Monad"
+join :: [[a]] -> [a]
+join = concat
+
+-- In Haskell the "return" function (unfortunate name)
+η :: a -> [a]
+η x = [x]
+ + +
+
+

Example: List (law verification)

+

Example: List is a functor (join is ⊙)

+ +
join [ join [[x,y,...,z]] ] = join [[x,y,...,z]]
+                            = join (join [[[x,y,...,z]]])
+join (η [x]) = [x] = join [η x]
+ +

Therefore ([],join,η) is a monad.

+
+
+

Monads useful?

+

A LOT of monad tutorial on the net. Just one example; the State Monad

+

DrawScene to State Screen DrawScene ; still pure.

+
main = drawImage (width,height)
+
+drawImage :: Screen -> DrawScene
+drawImage screen = do
+    drawPoint p screen
+    drawCircle c screen
+    drawRectangle r screen
+
+drawPoint point screen = ...
+drawCircle circle screen = ...
+drawRectangle rectangle screen = ...
+
main = do
+    put (Screen 1024 768)
+    drawImage
+
+drawImage :: State Screen DrawScene
+drawImage = do
+    drawPoint p
+    drawCircle c
+    drawRectangle r
+
+drawPoint :: Point -> State Screen DrawScene
+drawPoint p = do
+    Screen width height <- get
+    ...
+
+
+

fold

+fold +
+
+

κατα-morphism

+catamorphism +
+
+

κατα-morphism: fold generalization

+

acc type of the "accumulator":
fold :: (acc -> a -> acc) -> acc -> [a] -> acc

+

Idea: put the accumulated value inside the type.

+
-- Equivalent to fold (+1) 0 "cata"
+(Cons 'c' (Cons 'a' (Cons 't' (Cons 'a' Nil))))
+(Cons 'c' (Cons 'a' (Cons 't' (Cons 'a' 0))))
+(Cons 'c' (Cons 'a' (Cons 't' 1)))
+(Cons 'c' (Cons 'a' 2))
+(Cons 'c' 3)
+4
+ + +

But where are all the informations? (+1) and 0?

+
+
+

κατα-morphism: Missing Information

+

Where is the missing information?

+ +

First example, make length on [Char]

+
+
+

κατα-morphism: Type work

+

+data StrF a = Cons Char a | Nil
+data Str' = StrF Str'
+
+-- generalize the construction of Str to other datatype
+-- Mu: type fixed point
+-- Mu :: (* -> *) -> *
+
+data Mu f = InF { outF :: f (Mu f) }
+data Str = Mu StrF
+
+-- Example
+foo=InF { outF = Cons 'f'
+        (InF { outF = Cons 'o'
+            (InF { outF = Cons 'o'
+                (InF { outF = Nil })})})}
+ + +
+
+

κατα-morphism: missing information retrieved

+
type Algebra f a = f a -> a
+instance Functor (StrF a) =
+    fmap f (Cons c x) = Cons c (f x)
+    fmap _ Nil = Nil
+ +
cata :: Functor f => Algebra f a -> Mu f -> a
+cata f = f . fmap (cata f) . outF
+ + + +
+
+

κατα-morphism: Finally length

+

All needed information for making length.

+
instance Functor (StrF a) =
+    fmap f (Cons c x) = Cons c (f x)
+    fmap _ Nil = Nil
+
+length' :: Str -> Int
+length' = cata phi where
+    phi :: Algebra StrF Int -- StrF Int -> Int
+    phi (Cons a b) = 1 + b
+    phi Nil = 0
+
+main = do
+    l <- length' $ stringToStr "Toto"
+    ...
+
+
+

κατα-morphism: extension to Trees

+

Once you get the trick, it is easy to extent to most Functor.

+
type Tree = Mu TreeF
+data TreeF x = Node Int [x]
+
+instance Functor TreeF where
+  fmap f (Node e xs) = Node e (fmap f xs)
+
+depth = cata phi where
+  phi :: Algebra TreeF Int -- TreeF Int -> Int
+  phi (Node x sons) = 1 + foldr max 0 sons
+
+
+

Conclusion

+

Category Theory oriented Programming:

+ +

No cat were harmed in the making of this presentation.

+
+ + + + + + + + + + +

+ + / + +

+ + +
+ + + + +
+ + +# + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/categories.pdf b/categories.pdf new file mode 100644 index 0000000..e243792 Binary files /dev/null and b/categories.pdf differ diff --git a/categories/10_Introduction/010_.html b/categories/10_Introduction/010_.html new file mode 100644 index 0000000..0fa74fc --- /dev/null +++ b/categories/10_Introduction/010_.html @@ -0,0 +1,16 @@ +
+

Category Theory & Programming

+by Yann Esposito +
+ + @yogsototh, + + + +yogsototh + +
+
+
ENTER FULLSCREEN
+ HTML presentation: use arrows, space to navigate. +
+
diff --git a/categories/10_Introduction/020_Plan.html b/categories/10_Introduction/020_Plan.html new file mode 100644 index 0000000..4826772 --- /dev/null +++ b/categories/10_Introduction/020_Plan.html @@ -0,0 +1,6 @@ +

Plan

+ diff --git a/categories/10_Introduction/030_General_Overview.html b/categories/10_Introduction/030_General_Overview.html new file mode 100644 index 0000000..2a86df2 --- /dev/null +++ b/categories/10_Introduction/030_General_Overview.html @@ -0,0 +1,16 @@ +

General Overview

+
+Samuel Eilenberg Saunders Mac Lane +
+ +

Recent Math Field
1942-45, Samuel Eilenberg & Saunders Mac Lane

+

Certainly one of the more abstract branches of math

+ +

+★: When is one thing equal to some other thing?, Barry Mazur, 2007
☆: Physics, Topology, Logic and Computation: A Rosetta Stone, John C. Baez, Mike Stay, 2009 +

+ + diff --git a/categories/10_Introduction/030_General_Overview.md b/categories/10_Introduction/030_General_Overview.md new file mode 100644 index 0000000..e935990 --- /dev/null +++ b/categories/10_Introduction/030_General_Overview.md @@ -0,0 +1,20 @@ +General Overview +---------------- + +
+Samuel Eilenberg +Saunders Mac Lane +
+ +_Recent Math Field_ +1942-45, Samuel Eilenberg & Saunders Mac Lane + +Certainly one of the more abstract branches of math + +- _New math foundation_ + formalism abstraction, package entire theory +- _Bridge between disciplines_ + Physics, Quantum Physics, Topology, Logic, Computer Science + +

★: When is one thing equal to some other thing?, Barry Mazur, 2007
+☆: Physics, Topology, Logic and Computation: A Rosetta Stone, John C. Baez, Mike Stay, 2009

diff --git a/categories/10_Introduction/040_From_a_Programmer_perspective.html b/categories/10_Introduction/040_From_a_Programmer_perspective.html new file mode 100644 index 0000000..010f6d0 --- /dev/null +++ b/categories/10_Introduction/040_From_a_Programmer_perspective.html @@ -0,0 +1,4 @@ +

From a Programmer perspective

+
+

Category Theory is a new language/framework for Math

+
diff --git a/categories/10_Introduction/040_From_a_Programmer_perspective.md b/categories/10_Introduction/040_From_a_Programmer_perspective.md new file mode 100644 index 0000000..a6b9aab --- /dev/null +++ b/categories/10_Introduction/040_From_a_Programmer_perspective.md @@ -0,0 +1,4 @@ +From a Programmer perspective +---------------- + +> Category Theory is a new language/framework for Math diff --git a/categories/10_Introduction/050_Math_Programming_relation.html b/categories/10_Introduction/050_Math_Programming_relation.html new file mode 100644 index 0000000..42ddab1 --- /dev/null +++ b/categories/10_Introduction/050_Math_Programming_relation.html @@ -0,0 +1,5 @@ +

Math Programming relation

+Buddha Fractal +

Programming is doing Math

+

Not convinced?
Certainly a vocabulary problem.

+

One of the goal of Category Theory is to create a homogeneous vocabulary between different disciplines.

diff --git a/categories/10_Introduction/050_Math_Programming_relation.md b/categories/10_Introduction/050_Math_Programming_relation.md new file mode 100644 index 0000000..90c39b7 --- /dev/null +++ b/categories/10_Introduction/050_Math_Programming_relation.md @@ -0,0 +1,11 @@ +Math Programming relation +------------------------- + +Buddha Fractal + +Programming *is* doing Math + +Not convinced? +Certainly a _vocabulary_ problem. + +One of the goal of Category Theory is to create a _homogeneous vocabulary_ between different disciplines. diff --git a/categories/10_Introduction/060_Vocabulary.html b/categories/10_Introduction/060_Vocabulary.html new file mode 100644 index 0000000..f4dda42 --- /dev/null +++ b/categories/10_Introduction/060_Vocabulary.html @@ -0,0 +1,6 @@ +

Vocabulary

+mind blown +

Math vocabulary used in this presentation:

+
+

Category, Morphism, Associativity, Preorder, Functor, Endofunctor, Categorial property, Commutative diagram, Isomorph, Initial, Dual, Monoid, Natural transformation, Monad, Klesli arrows, κατα-morphism, ...

+
diff --git a/categories/10_Introduction/060_Vocabulary.md b/categories/10_Introduction/060_Vocabulary.md new file mode 100644 index 0000000..36f6959 --- /dev/null +++ b/categories/10_Introduction/060_Vocabulary.md @@ -0,0 +1,23 @@ +Vocabulary +---------- + +mind blown + +Math vocabulary used in this presentation: + +> Category, +> Morphism, +> Associativity, +> Preorder, +> Functor, Endofunctor, +> Categorial property, +> Commutative diagram, +> Isomorph, +> Initial, +> Dual, +> Monoid, +> Natural transformation, +> Monad, +> Klesli arrows, +> κατα-morphism, +> ... diff --git a/categories/10_Introduction/070_Programmer_Translation.html b/categories/10_Introduction/070_Programmer_Translation.html new file mode 100644 index 0000000..6d06990 --- /dev/null +++ b/categories/10_Introduction/070_Programmer_Translation.html @@ -0,0 +1,41 @@ +

Programmer Translation

+lolcat + + + + + + + + +
+Mathematician + +Programmer +
+Morphism + +Arrow +
+Monoid + +String-like +
+Preorder + +Acyclic graph +
+Isomorph + +The same +
+Natural transformation + +rearrangement function +
+Funny Category + +LOLCat +
+ + diff --git a/categories/10_Introduction/070_Programmer_Translation.md b/categories/10_Introduction/070_Programmer_Translation.md new file mode 100644 index 0000000..0132dc0 --- /dev/null +++ b/categories/10_Introduction/070_Programmer_Translation.md @@ -0,0 +1,14 @@ +Programmer Translation +---------------------- + +lolcat + + + + + + + + + +
MathematicianProgrammer
MorphismArrow
MonoidString-like
PreorderAcyclic graph
IsomorphThe same
Natural transformationrearrangement function
Funny CategoryLOLCat
diff --git a/categories/20_What/010_Plan.html b/categories/20_What/010_Plan.html new file mode 100644 index 0000000..52374ca --- /dev/null +++ b/categories/20_What/010_Plan.html @@ -0,0 +1,14 @@ +

Plan

+ diff --git a/categories/20_What/020_Category.html b/categories/20_What/020_Category.html new file mode 100644 index 0000000..0d14873 --- /dev/null +++ b/categories/20_What/020_Category.html @@ -0,0 +1,11 @@ +

Category

+ +

A way of representing things and ways to go between things.

+ +

A Category \(\mathcal{C}\) is defined by:

+ diff --git a/categories/20_What/030_Category_Objects.html b/categories/20_What/030_Category_Objects.html new file mode 100644 index 0000000..9002798 --- /dev/null +++ b/categories/20_What/030_Category_Objects.html @@ -0,0 +1,5 @@ +

Category: Objects

+ +objects + +

\(\ob{\mathcal{C}}\) is a collection

diff --git a/categories/20_What/040_Category_Morphisms.html b/categories/20_What/040_Category_Morphisms.html new file mode 100644 index 0000000..c05024d --- /dev/null +++ b/categories/20_What/040_Category_Morphisms.html @@ -0,0 +1,8 @@ +

Category: Morphisms

+ +morphisms + +

\(A\) and \(B\) objects of \(\C\)
+\(\hom{A,B}\) is a collection of morphisms
+\(f:A→B\) denote the fact \(f\) belongs to \(\hom{A,B}\)

+

\(\hom{\C}\) the collection of all morphisms of \(\C\)

diff --git a/categories/20_What/050_Category_Composition.html b/categories/20_What/050_Category_Composition.html new file mode 100644 index 0000000..7577480 --- /dev/null +++ b/categories/20_What/050_Category_Composition.html @@ -0,0 +1,5 @@ +

Category: Composition

+

Composition (∘): associate to each couple \(f:A→B, g:B→C\) + $$g∘f:A\rightarrow C$$ +

+composition diff --git a/categories/20_What/060_Category_laws_neutral_element.html b/categories/20_What/060_Category_laws_neutral_element.html new file mode 100644 index 0000000..1ad9230 --- /dev/null +++ b/categories/20_What/060_Category_laws_neutral_element.html @@ -0,0 +1,4 @@ +

Category laws: neutral element

+

for each object \(X\), there is an \(\id_X:X→X\),
+such that for each \(f:A→B\):

+identity diff --git a/categories/20_What/070_Category_laws_Associativity.html b/categories/20_What/070_Category_laws_Associativity.html new file mode 100644 index 0000000..fc5f0f3 --- /dev/null +++ b/categories/20_What/070_Category_laws_Associativity.html @@ -0,0 +1,3 @@ +

Category laws: Associativity

+

Composition is associative:

+associative composition diff --git a/categories/20_What/080_Commutative_diagrams.html b/categories/20_What/080_Commutative_diagrams.html new file mode 100644 index 0000000..6a87acf --- /dev/null +++ b/categories/20_What/080_Commutative_diagrams.html @@ -0,0 +1,19 @@ +

Commutative diagrams

+ +

Two path with the same source and destination are equal.

+
+ Commutative Diagram (Associativity) +
+ \((h∘g)∘f = h∘(g∘f) \) +
+
+
+ Commutative Diagram (Identity law) +
+ \(id_B∘f = f = f∘id_A \) +
+
diff --git a/categories/20_What/090_Question_Time.html b/categories/20_What/090_Question_Time.html new file mode 100644 index 0000000..4644358 --- /dev/null +++ b/categories/20_What/090_Question_Time.html @@ -0,0 +1,8 @@ +

Question Time!

+ +
+ +
+- French-only joke - +
+
diff --git a/categories/20_What/100_Can_this_be_a_category.html b/categories/20_What/100_Can_this_be_a_category.html new file mode 100644 index 0000000..ce793f6 --- /dev/null +++ b/categories/20_What/100_Can_this_be_a_category.html @@ -0,0 +1,21 @@ +

Can this be a category?

+

\(\ob{\C},\hom{\C}\) fixed, is there a valid ∘?

+
+ Category example 1 +
+ YES +
+
+
+ Category example 2 +
+ no candidate for \(g∘f\) +
NO +
+
+
+ Category example 3 +
+ YES +
+
diff --git a/categories/20_What/110_Can_this_be_a_category.html b/categories/20_What/110_Can_this_be_a_category.html new file mode 100644 index 0000000..91d74f8 --- /dev/null +++ b/categories/20_What/110_Can_this_be_a_category.html @@ -0,0 +1,17 @@ +

Can this be a category?

+
+ Category example 4 +
+ no candidate for \(f:C→B\) +
NO +
+
+
+ Category example 5 +
+ \((h∘g)∘f=\id_B∘f=f\)
+ \(h∘(g∘f)=h∘\id_A=h\)
+ but \(h≠f\)
+ NO +
+
diff --git a/categories/20_What/120_Categories_Examples.html b/categories/20_What/120_Categories_Examples.html new file mode 100644 index 0000000..5207c1d --- /dev/null +++ b/categories/20_What/120_Categories_Examples.html @@ -0,0 +1,8 @@ +

Categories Examples

+ +
+Basket of cats +
+- Basket of Cats - +
+
diff --git a/categories/20_What/130_Category_Set.html b/categories/20_What/130_Category_Set.html new file mode 100644 index 0000000..99fab68 --- /dev/null +++ b/categories/20_What/130_Category_Set.html @@ -0,0 +1,13 @@ +

Category \(\Set\)

+ + + + diff --git a/categories/20_What/140_Categories_Everywhere.html b/categories/20_What/140_Categories_Everywhere.html new file mode 100644 index 0000000..1d78687 --- /dev/null +++ b/categories/20_What/140_Categories_Everywhere.html @@ -0,0 +1,11 @@ +

Categories Everywhere?

+Cats everywhere + diff --git a/categories/20_What/150_Smaller_Examples.html b/categories/20_What/150_Smaller_Examples.html new file mode 100644 index 0000000..0b1621b --- /dev/null +++ b/categories/20_What/150_Smaller_Examples.html @@ -0,0 +1,13 @@ +

Smaller Examples

+ +

Strings

+Monoids are one object categories + + diff --git a/categories/20_What/160_Finite_Example.html b/categories/20_What/160_Finite_Example.html new file mode 100644 index 0000000..a858b35 --- /dev/null +++ b/categories/20_What/160_Finite_Example.html @@ -0,0 +1,15 @@ +

Finite Example?

+ +

Graph

+
+Each graph is a category +
+ + diff --git a/categories/20_What/170_Number_construction.html b/categories/20_What/170_Number_construction.html new file mode 100644 index 0000000..6e4cf58 --- /dev/null +++ b/categories/20_What/170_Number_construction.html @@ -0,0 +1,4 @@ +

Number construction

+ +

Each Numbers as a whole category

+Each number as a category diff --git a/categories/20_What/180_Degenerated_Categories_Monoids.html b/categories/20_What/180_Degenerated_Categories_Monoids.html new file mode 100644 index 0000000..3d5c9a9 --- /dev/null +++ b/categories/20_What/180_Degenerated_Categories_Monoids.html @@ -0,0 +1,9 @@ +

Degenerated Categories: Monoids

+ +Monoids are one object categories +

Each Monoid \((M,e,⊙): \ob{M}=\{∙\},\hom{M}=M,\circ = ⊙\)

+

Only one object.

+

Examples:

+ diff --git a/categories/20_What/190_Degenerated_Categories_Preorders_P.html b/categories/20_What/190_Degenerated_Categories_Preorders_P.html new file mode 100644 index 0000000..79a3956 --- /dev/null +++ b/categories/20_What/190_Degenerated_Categories_Preorders_P.html @@ -0,0 +1,10 @@ +

Degenerated Categories: Preorders \((P,≤)\)

+ + + +

At most one morphism between two objects.

+ +preorder category diff --git a/categories/20_What/200_Degenerated_Categories_Discrete_Categories.html b/categories/20_What/200_Degenerated_Categories_Discrete_Categories.html new file mode 100644 index 0000000..517cb4e --- /dev/null +++ b/categories/20_What/200_Degenerated_Categories_Discrete_Categories.html @@ -0,0 +1,6 @@ +

Degenerated Categories: Discrete Categories

+ +Any set can be a category +

Any Set

+

Any set \(E: \ob{E}=E, \hom{x,y}=\{x\} ⇔ x=y \)

+

Only identities

diff --git a/categories/20_What/210_Categorical_Properties.html b/categories/20_What/210_Categorical_Properties.html new file mode 100644 index 0000000..b194738 --- /dev/null +++ b/categories/20_What/210_Categorical_Properties.html @@ -0,0 +1,11 @@ +

Categorical Properties

+ +

Any property which can be expressed in term of category, objects, morphism and composition.

+ + diff --git a/categories/20_What/220_Isomorph.html b/categories/20_What/220_Isomorph.html new file mode 100644 index 0000000..52bf553 --- /dev/null +++ b/categories/20_What/220_Isomorph.html @@ -0,0 +1,3 @@ +

Isomorph

+

isomorph cats isomorphism: \(f:A→B\) which can be "undone" i.e.
\(∃g:B→A\), \(g∘f=id_A\) & \(f∘g=id_B\)
in this case, \(A\) & \(B\) are isomorphic.

+

A≌B means A and B are essentially the same.
In Category Theory, = is in fact mostly .
For example in commutative diagrams.

diff --git a/categories/20_What/220_Isomorph.md b/categories/20_What/220_Isomorph.md new file mode 100644 index 0000000..c73e1de --- /dev/null +++ b/categories/20_What/220_Isomorph.md @@ -0,0 +1,11 @@ +Isomorph +-------- +isomorph cats +isomorphism: +\\(f:A→B\\) which can be "undone" _i.e._ +\\(∃g:B→A\\), \\(g∘f=id\_A\\) & \\(f∘g=id\_B\\) +in this case, \\(A\\) & \\(B\\) are isomorphic. + +A≌B means A and B are essentially the same. +In Category Theory, = is in fact mostly . +For example in commutative diagrams. diff --git a/categories/20_What/230_Functor.html b/categories/20_What/230_Functor.html new file mode 100644 index 0000000..29d7d20 --- /dev/null +++ b/categories/20_What/230_Functor.html @@ -0,0 +1,15 @@ +

Functor

+ +

A functor is a mapping between two categories. +Let \(\C\) and \(\D\) be two categories. +A functor \(\F\) from \(\C\) to \(\D\):

+ diff --git a/categories/20_What/240_Functor_Example_ob_ob.html b/categories/20_What/240_Functor_Example_ob_ob.html new file mode 100644 index 0000000..0592c4e --- /dev/null +++ b/categories/20_What/240_Functor_Example_ob_ob.html @@ -0,0 +1,3 @@ +

Functor Example (ob → ob)

+ +Functor diff --git a/categories/20_What/250_Functor_Example_hom_hom.html b/categories/20_What/250_Functor_Example_hom_hom.html new file mode 100644 index 0000000..845d7f4 --- /dev/null +++ b/categories/20_What/250_Functor_Example_hom_hom.html @@ -0,0 +1,3 @@ +

Functor Example (hom → hom)

+ +Functor diff --git a/categories/20_What/260_Functor_Example.html b/categories/20_What/260_Functor_Example.html new file mode 100644 index 0000000..ae20306 --- /dev/null +++ b/categories/20_What/260_Functor_Example.html @@ -0,0 +1,3 @@ +

Functor Example

+ +Functor diff --git a/categories/20_What/270_Endofunctors.html b/categories/20_What/270_Endofunctors.html new file mode 100644 index 0000000..a6333ee --- /dev/null +++ b/categories/20_What/270_Endofunctors.html @@ -0,0 +1,4 @@ +

Endofunctors

+ +

An endofunctor for \(\C\) is a functor \(F:\C→\C\).

+Endofunctor diff --git a/categories/20_What/280_Category_of_Categories.html b/categories/20_What/280_Category_of_Categories.html new file mode 100644 index 0000000..2f812ad --- /dev/null +++ b/categories/20_What/280_Category_of_Categories.html @@ -0,0 +1,9 @@ +

Category of Categories

+ + + +

Categories and functors form a category: \(\Cat\)

+ diff --git a/categories/30_How/010_Plan.html b/categories/30_How/010_Plan.html new file mode 100644 index 0000000..dbe04b5 --- /dev/null +++ b/categories/30_How/010_Plan.html @@ -0,0 +1,13 @@ +

Plan

+ diff --git a/categories/30_How/020_Hask.html b/categories/30_How/020_Hask.html new file mode 100644 index 0000000..9c66a84 --- /dev/null +++ b/categories/30_How/020_Hask.html @@ -0,0 +1,15 @@ +

Hask

+ +

Category \(\Hask\):

+ +Haskell Category Representation + + + +

Forget glitches because of undefined.

diff --git a/categories/30_How/030_Haskell_Kinds.html b/categories/30_How/030_Haskell_Kinds.html new file mode 100644 index 0000000..231862e --- /dev/null +++ b/categories/30_How/030_Haskell_Kinds.html @@ -0,0 +1,7 @@ +

Haskell Kinds

+

In Haskell some types can take type variable(s). Typically: [a].

+

Types have kinds; The kind is to type what type is to function. Kind are the types for types (so meta).

+
Int, Char :: *
+[], Maybe :: * -> *
+(,) :: * -> * -> *
+[Int], Maybe Char, Maybe [Int] :: *
diff --git a/categories/30_How/030_Haskell_Kinds.md b/categories/30_How/030_Haskell_Kinds.md new file mode 100644 index 0000000..f01c67b --- /dev/null +++ b/categories/30_How/030_Haskell_Kinds.md @@ -0,0 +1,16 @@ +Haskell Kinds +------------- + +In Haskell some types can take type variable(s). +Typically: `[a]`. + +Types have _kinds_; +The kind is to type what type is to function. +Kind are the types for types (so meta). + +~~~ +Int, Char :: * +[], Maybe :: * -> * +(,) :: * -> * -> * +[Int], Maybe Char, Maybe [Int] :: * +~~~ diff --git a/categories/30_How/040_Haskell_Types.html b/categories/30_How/040_Haskell_Types.html new file mode 100644 index 0000000..e136e25 --- /dev/null +++ b/categories/30_How/040_Haskell_Types.html @@ -0,0 +1,15 @@ +

Haskell Types

+

Sometimes, the type determine a lot about the function:

+
fst :: (a,b) -> a -- Only one choice
+snd :: (a,b) -> b -- Only one choice
+f :: a -> [a]     -- Many choices
+-- Possibilities: f x=[], or [x], or [x,x] or [x,...,x]
+
+? :: [a] -> [a] -- Many choices
+-- can only rearrange: duplicate/remove/reorder elements
+-- for example: the type of addOne isn't [a] -> [a]
+addOne l = map (+1) l
+-- The (+1) force 'a' to be a Num.
+ +

+

★:Theorems for free!, Philip Wadler, 1989

diff --git a/categories/30_How/040_Haskell_Types.md b/categories/30_How/040_Haskell_Types.md new file mode 100644 index 0000000..18aa683 --- /dev/null +++ b/categories/30_How/040_Haskell_Types.md @@ -0,0 +1,17 @@ +Haskell Types +------------- + +Sometimes, the type determine a lot about the function: + +
fst :: (a,b) -> a -- Only one choice
+snd :: (a,b) -> b -- Only one choice
+f :: a -> [a]     -- Many choices
+-- Possibilities: f x=[], or [x], or [x,x] or [x,...,x]
+
+? :: [a] -> [a] -- Many choices
+-- can only rearrange: duplicate/remove/reorder elements
+-- for example: the type of addOne isn't [a] -> [a]
+addOne l = map (+1) l
+-- The (+1) force 'a' to be a Num.
+ +

★:Theorems for free!, Philip Wadler, 1989 diff --git a/categories/30_How/100_Functors/010_Haskell_Functor_vs_Hask_Functor.html b/categories/30_How/100_Functors/010_Haskell_Functor_vs_Hask_Functor.html new file mode 100644 index 0000000..467b64d --- /dev/null +++ b/categories/30_How/100_Functors/010_Haskell_Functor_vs_Hask_Functor.html @@ -0,0 +1,11 @@ +

Haskell Functor vs \(\Hask\) Functor

+ +

A Haskell Functor is a type F :: * -> * which belong to the type class Functor ; thus instantiate +fmap :: (a -> b) -> (F a -> F b). + +

& F: \(\ob{\Hask}→\ob{\Hask}\)
& fmap: \(\hom{\Hask}→\hom{\Hask}\) + +

The couple (F,fmap) is a \(\Hask\)'s functor if for any x :: F a:

+ diff --git a/categories/30_How/100_Functors/020_Haskell_Functors_Example_Maybe.html b/categories/30_How/100_Functors/020_Haskell_Functors_Example_Maybe.html new file mode 100644 index 0000000..1ad8649 --- /dev/null +++ b/categories/30_How/100_Functors/020_Haskell_Functors_Example_Maybe.html @@ -0,0 +1,10 @@ +

Haskell Functors Example: Maybe

+ +
data Maybe a = Just a | Nothing
+instance Functor Maybe where
+    fmap :: (a -> b) -> (Maybe a -> Maybe b)
+    fmap f (Just a) = Just (f a)
+    fmap f Nothing = Nothing
+
fmap (+1) (Just 1) == Just 2
+fmap (+1) Nothing  == Nothing
+fmap head (Just [1,2,3]) == Just 1
diff --git a/categories/30_How/100_Functors/030_Haskell_Functors_Example_List.html b/categories/30_How/100_Functors/030_Haskell_Functors_Example_List.html new file mode 100644 index 0000000..6766695 --- /dev/null +++ b/categories/30_How/100_Functors/030_Haskell_Functors_Example_List.html @@ -0,0 +1,8 @@ +

Haskell Functors Example: List

+ +
instance Functor ([]) where
+	fmap :: (a -> b) -> [a] -> [b]
+	fmap = map
+
fmap (+1) [1,2,3]           == [2,3,4]
+fmap (+1) []                == []
+fmap head [[1,2,3],[4,5,6]] == [1,4]
diff --git a/categories/30_How/100_Functors/040_Haskell_Functors_for_the_programmer.html b/categories/30_How/100_Functors/040_Haskell_Functors_for_the_programmer.html new file mode 100644 index 0000000..c392df5 --- /dev/null +++ b/categories/30_How/100_Functors/040_Haskell_Functors_for_the_programmer.html @@ -0,0 +1,10 @@ +

Haskell Functors for the programmer

+

Functor is a type class used for types that can be mapped over.

+ diff --git a/categories/30_How/100_Functors/040_Haskell_Functors_for_the_programmer.md b/categories/30_How/100_Functors/040_Haskell_Functors_for_the_programmer.md new file mode 100644 index 0000000..ea3ba38 --- /dev/null +++ b/categories/30_How/100_Functors/040_Haskell_Functors_for_the_programmer.md @@ -0,0 +1,11 @@ +Haskell Functors for the programmer +------------------------------ + +`Functor` is a type class used for types that can be mapped over. + +- Containers: `[]`, Trees, Map, HashMap... +- "Feature Type": + - `Maybe a`: help to handle absence of `a`. + Ex: `safeDiv x 0 ⇒ Nothing` + - `Either String a`: help to handle errors + Ex: `reportDiv x 0 ⇒ Left "Division by 0!"` diff --git a/categories/30_How/100_Functors/050_Haskell_Functor_intuition.html b/categories/30_How/100_Functors/050_Haskell_Functor_intuition.html new file mode 100644 index 0000000..02d5309 --- /dev/null +++ b/categories/30_How/100_Functors/050_Haskell_Functor_intuition.html @@ -0,0 +1,5 @@ +

Haskell Functor intuition

+ +

Put normal function inside a container. Ex: list, trees...

+ +Haskell Functor as a box play diff --git a/categories/30_How/100_Functors/060_Haskell_Functor_properties.html b/categories/30_How/100_Functors/060_Haskell_Functor_properties.html new file mode 100644 index 0000000..c35cc8e --- /dev/null +++ b/categories/30_How/100_Functors/060_Haskell_Functor_properties.html @@ -0,0 +1,7 @@ +

Haskell Functor properties

+ +

Haskell Functors are:

+ + diff --git a/categories/30_How/100_Functors/070_Functor_as_boxes.html b/categories/30_How/100_Functors/070_Functor_as_boxes.html new file mode 100644 index 0000000..32c1573 --- /dev/null +++ b/categories/30_How/100_Functors/070_Functor_as_boxes.html @@ -0,0 +1,6 @@ +

Functor as boxes

+ +

Haskell functor can be seen as boxes containing all Haskell types and functions. +Haskell types is fractal:

+ +Haskell functor representation diff --git a/categories/30_How/100_Functors/080_Functor_as_boxes.html b/categories/30_How/100_Functors/080_Functor_as_boxes.html new file mode 100644 index 0000000..40596f6 --- /dev/null +++ b/categories/30_How/100_Functors/080_Functor_as_boxes.html @@ -0,0 +1,6 @@ +

Functor as boxes

+ +

Haskell functor can be seen as boxes containing all Haskell types and functions. +Haskell types is fractal:

+ +Haskell functor representation diff --git a/categories/30_How/100_Functors/090_Functor_as_boxes.html b/categories/30_How/100_Functors/090_Functor_as_boxes.html new file mode 100644 index 0000000..f3912e2 --- /dev/null +++ b/categories/30_How/100_Functors/090_Functor_as_boxes.html @@ -0,0 +1,6 @@ +

Functor as boxes

+ +

Haskell functor can be seen as boxes containing all Haskell types and functions. +Haskell types is fractal:

+ +Haskell functor representation diff --git a/categories/30_How/100_Functors/100_Non_Haskell_Hask_s_Functors.html b/categories/30_How/100_Functors/100_Non_Haskell_Hask_s_Functors.html new file mode 100644 index 0000000..d8a5cb4 --- /dev/null +++ b/categories/30_How/100_Functors/100_Non_Haskell_Hask_s_Functors.html @@ -0,0 +1,11 @@ +

"Non Haskell" Hask's Functors

+

A simple basic example is the \(id_\Hask\) functor. It simply cannot be expressed as a couple (F,fmap) where

+ +

Another example:

+ diff --git a/categories/30_How/100_Functors/100_Non_Haskell_Hask_s_Functors.md b/categories/30_How/100_Functors/100_Non_Haskell_Hask_s_Functors.md new file mode 100644 index 0000000..a03e4a7 --- /dev/null +++ b/categories/30_How/100_Functors/100_Non_Haskell_Hask_s_Functors.md @@ -0,0 +1,12 @@ +## "Non Haskell" Hask's Functors + +A simple basic example is the \\(id\_\\Hask\\) functor. +It simply cannot be expressed as a couple (`F`,`fmap`) where + +- `F::* -> *` +- `fmap :: (a -> b) -> (F a) -> (F b)` + +Another example: + +- F(`T`)=`Int` +- F(`f`)=`\_->0` diff --git a/categories/30_How/100_Functors/110_Also_Functor_inside_Hask.html b/categories/30_How/100_Functors/110_Also_Functor_inside_Hask.html new file mode 100644 index 0000000..0fd8d01 --- /dev/null +++ b/categories/30_How/100_Functors/110_Also_Functor_inside_Hask.html @@ -0,0 +1,18 @@ +

Also Functor inside \(\Hask\)

+

\(\mathtt{[a]}∈\ob{\Hask}\) but is also a category. Idem for Int.

+

length is a Functor from the category [a] to the cateogry Int:

+ +

+ +
+ diff --git a/categories/30_How/100_Functors/120_Category_of_Hask_Endofunctors.html b/categories/30_How/100_Functors/120_Category_of_Hask_Endofunctors.html new file mode 100644 index 0000000..8359252 --- /dev/null +++ b/categories/30_How/100_Functors/120_Category_of_Hask_Endofunctors.html @@ -0,0 +1,2 @@ +

Category of \(\Hask\) Endofunctors

+Category of Hask endofunctors diff --git a/categories/30_How/100_Functors/120_Category_of_Hask_Endofunctors.md b/categories/30_How/100_Functors/120_Category_of_Hask_Endofunctors.md new file mode 100644 index 0000000..23fb923 --- /dev/null +++ b/categories/30_How/100_Functors/120_Category_of_Hask_Endofunctors.md @@ -0,0 +1,4 @@ +Category of \\(\\Hask\\) Endofunctors +------------------------------------ + +Category of Hask endofunctors diff --git a/categories/30_How/100_Functors/130_Category_of_Functors.html b/categories/30_How/100_Functors/130_Category_of_Functors.html new file mode 100644 index 0000000..fa89915 --- /dev/null +++ b/categories/30_How/100_Functors/130_Category_of_Functors.html @@ -0,0 +1,8 @@ +

Category of Functors

+

If \(\C\) is small (\(\hom{\C}\) is a set). All functors from \(\C\) to some category \(\D\) form the category \(\mathrm{Func}(\C,\D)\).

+ +

\(\mathrm{Func}(\C,\C)\) is the category of endofunctors of \(\C\).

diff --git a/categories/30_How/100_Functors/130_Category_of_Functors.md b/categories/30_How/100_Functors/130_Category_of_Functors.md new file mode 100644 index 0000000..4a07c89 --- /dev/null +++ b/categories/30_How/100_Functors/130_Category_of_Functors.md @@ -0,0 +1,12 @@ +Category of Functors +------------------------ + +If \\(\\C\\) is _small_ (\\(\\hom{\\C}\\) is a set). +All functors from \\(\\C\\) to some category \\(\\D\\) +form the category \\(\\mathrm{Func}(\\C,\\D)\\). + +- \\(\\ob{\\mathrm{Func}(\\C,\\D)}\\): Functors \\(F:\\C→\\D\\) +- \\(\\hom{\\mathrm{Func}(\\C,\\D)}\\): _natural transformations_ +- ∘: Functor composition + +\\(\\mathrm{Func}(\\C,\\C)\\) is the category of endofunctors of \\(\\C\\). diff --git a/categories/30_How/100_Functors/140_Natural_Transformations.html b/categories/30_How/100_Functors/140_Natural_Transformations.html new file mode 100644 index 0000000..11020c0 --- /dev/null +++ b/categories/30_How/100_Functors/140_Natural_Transformations.html @@ -0,0 +1,4 @@ +

Natural Transformations

+

Let \(F\) and \(G\) be two functors from \(\C\) to \(\D\).

+

Natural transformation commutative diagram A natural transformation: familly η ; \(η_X\in\hom{\D}\) for \(X\in\ob{\C}\) s.t.

+

ex: between Haskell functors; F a -> G a
Rearragement functions only.

diff --git a/categories/30_How/100_Functors/140_Natural_Transformations.md b/categories/30_How/100_Functors/140_Natural_Transformations.md new file mode 100644 index 0000000..9cfb176 --- /dev/null +++ b/categories/30_How/100_Functors/140_Natural_Transformations.md @@ -0,0 +1,10 @@ +Natural Transformations +----------------------- + +Let \\(F\\) and \\(G\\) be two functors from \\(\\C\\) to \\(\\D\\). + +Natural transformation commutative diagram +_A natural transformation:_ familly η ; \\(η\_X\\in\\hom{\\D}\\) for \\(X\\in\\ob{\\C}\\) s.t. + +ex: between Haskell functors; `F a -> G a` +Rearragement functions only. diff --git a/categories/30_How/200_Monads/010_Natural_Transformation_Examples_1_4.html b/categories/30_How/200_Monads/010_Natural_Transformation_Examples_1_4.html new file mode 100644 index 0000000..716b90f --- /dev/null +++ b/categories/30_How/200_Monads/010_Natural_Transformation_Examples_1_4.html @@ -0,0 +1,13 @@ +

Natural Transformation Examples (1/4)

+
data Tree a = Empty | Node a [Tree a]
+toTree :: [a] -> Tree a
+toTree [] = Empty
+toTree (x:xs) = Node x [toTree xs]
+ +

toTree is a natural transformation. It is also a morphism from [] to Tree in the Category of \(\Hask\) endofunctors.

+natural transformation commutative diagram +
+natural transformation commutative diagram +
+ + diff --git a/categories/30_How/200_Monads/010_Natural_Transformation_Examples_1_4.md b/categories/30_How/200_Monads/010_Natural_Transformation_Examples_1_4.md new file mode 100644 index 0000000..52ff3b2 --- /dev/null +++ b/categories/30_How/200_Monads/010_Natural_Transformation_Examples_1_4.md @@ -0,0 +1,16 @@ +Natural Transformation Examples (1/4) +------------------------------------ + +
data Tree a = Empty | Node a [Tree a]
+toTree :: [a] -> Tree a
+toTree [] = Empty
+toTree (x:xs) = Node x [toTree xs]
+ + +`toTree` is a natural transformation. +It is also a morphism from `[]` to `Tree` in the Category of \\(\\Hask\\) endofunctors. + +natural transformation commutative diagram +
+natural transformation commutative diagram +
diff --git a/categories/30_How/200_Monads/020_Natural_Transformation_Examples_2_4.html b/categories/30_How/200_Monads/020_Natural_Transformation_Examples_2_4.html new file mode 100644 index 0000000..4054c64 --- /dev/null +++ b/categories/30_How/200_Monads/020_Natural_Transformation_Examples_2_4.html @@ -0,0 +1,13 @@ +

Natural Transformation Examples (2/4)

+
data Tree a = Empty | Node a [Tree a]
+toList :: Tree a -> [a]
+toList Empty = []
+toList (Node x l) = [x] ++ concat (map toList l)
+ +

toList is a natural transformation. It is also a morphism from Tree to [] in the Category of \(\Hask\) endofunctors.

+natural transformation commutative diagram +
+natural transformation commutative diagram
toList . toTree = id & toTree . toList = id &
therefore [] & Tree are isomorph.
+
+ + diff --git a/categories/30_How/200_Monads/020_Natural_Transformation_Examples_2_4.md b/categories/30_How/200_Monads/020_Natural_Transformation_Examples_2_4.md new file mode 100644 index 0000000..f737f65 --- /dev/null +++ b/categories/30_How/200_Monads/020_Natural_Transformation_Examples_2_4.md @@ -0,0 +1,19 @@ +Natural Transformation Examples (2/4) +------------------------------------ + +
data Tree a = Empty | Node a [Tree a]
+toList :: Tree a -> [a]
+toList Empty = []
+toList (Node x l) = [x] ++ concat (map toList l)
+ + +`toList` is a natural transformation. +It is also a morphism from `Tree` to `[]` in the Category of \\(\\Hask\\) endofunctors. + +natural transformation commutative diagram +
+natural transformation commutative diagram +
toList . toTree = id & toTree . toList = id &
+therefore [] & Tree are isomorph. +
+
diff --git a/categories/30_How/200_Monads/030_Natural_Transformation_Examples_3_4.html b/categories/30_How/200_Monads/030_Natural_Transformation_Examples_3_4.html new file mode 100644 index 0000000..aa49249 --- /dev/null +++ b/categories/30_How/200_Monads/030_Natural_Transformation_Examples_3_4.html @@ -0,0 +1,12 @@ +

Natural Transformation Examples (3/4)

+
toMaybe :: [a] -> Maybe a
+toMaybe [] = Nothing
+toMaybe (x:xs) = Just x
+ +

toMaybe is a natural transformation. It is also a morphism from [] to Maybe in the Category of \(\Hask\) endofunctors.

+natural transformation commutative diagram +
+natural transformation commutative diagram +
+ + diff --git a/categories/30_How/200_Monads/030_Natural_Transformation_Examples_3_4.md b/categories/30_How/200_Monads/030_Natural_Transformation_Examples_3_4.md new file mode 100644 index 0000000..95eb4de --- /dev/null +++ b/categories/30_How/200_Monads/030_Natural_Transformation_Examples_3_4.md @@ -0,0 +1,15 @@ +Natural Transformation Examples (3/4) +------------------------------------- + +
toMaybe :: [a] -> Maybe a
+toMaybe [] = Nothing
+toMaybe (x:xs) = Just x
+ + +`toMaybe` is a natural transformation. +It is also a morphism from `[]` to `Maybe` in the Category of \\(\\Hask\\) endofunctors. + +natural transformation commutative diagram +
+natural transformation commutative diagram +
diff --git a/categories/30_How/200_Monads/040_Natural_Transformation_Examples_4_4.html b/categories/30_How/200_Monads/040_Natural_Transformation_Examples_4_4.html new file mode 100644 index 0000000..90b11a7 --- /dev/null +++ b/categories/30_How/200_Monads/040_Natural_Transformation_Examples_4_4.html @@ -0,0 +1,12 @@ +

Natural Transformation Examples (4/4)

+
mToList :: Maybe a -> [a]
+mToList Nothing = []
+mToList Just x  = [x]
+ +

toMaybe is a natural transformation. It is also a morphism from [] to Maybe in the Category of \(\Hask\) endofunctors.

+natural transformation commutative diagram +
+relation between [] and Maybe
There is no isomorphism.
Hint: Bool lists longer than 1.
+
+ + diff --git a/categories/30_How/200_Monads/040_Natural_Transformation_Examples_4_4.md b/categories/30_How/200_Monads/040_Natural_Transformation_Examples_4_4.md new file mode 100644 index 0000000..512d558 --- /dev/null +++ b/categories/30_How/200_Monads/040_Natural_Transformation_Examples_4_4.md @@ -0,0 +1,18 @@ +Natural Transformation Examples (4/4) +------------------------------------- + +
mToList :: Maybe a -> [a]
+mToList Nothing = []
+mToList Just x  = [x]
+ + +`toMaybe` is a natural transformation. +It is also a morphism from `[]` to `Maybe` in the Category of \\(\\Hask\\) endofunctors. + +natural transformation commutative diagram +
+relation between [] and Maybe +
There is no isomorphism.
+Hint: Bool lists longer than 1. +
+
diff --git a/categories/30_How/200_Monads/050_Composition_problem.html b/categories/30_How/200_Monads/050_Composition_problem.html new file mode 100644 index 0000000..5046041 --- /dev/null +++ b/categories/30_How/200_Monads/050_Composition_problem.html @@ -0,0 +1,7 @@ +

Composition problem

+

The Problem; example with lists:

+
f x = [x]       ⇒ f 1 = [1]   ⇒ (f.f) 1 = [[1]] ✗
+g x = [x+1]     ⇒ g 1 = [2]   ⇒ (g.g) 1 = ERROR [2]+1 ✗
+h x = [x+1,x*3] ⇒ h 1 = [2,3] ⇒ (h.h) 1 = ERROR [2,3]+1 ✗ 
+ +

The same problem with most f :: a -> F a functions and functor F.

diff --git a/categories/30_How/200_Monads/050_Composition_problem.md b/categories/30_How/200_Monads/050_Composition_problem.md new file mode 100644 index 0000000..2b1316d --- /dev/null +++ b/categories/30_How/200_Monads/050_Composition_problem.md @@ -0,0 +1,10 @@ +Composition problem +-------------------------------------------- + +The Problem; example with lists: + +
f x = [x]       ⇒ f 1 = [1]   ⇒ (f.f) 1 = [[1]] ✗
+g x = [x+1]     ⇒ g 1 = [2]   ⇒ (g.g) 1 = ERROR [2]+1 ✗
+h x = [x+1,x*3] ⇒ h 1 = [2,3] ⇒ (h.h) 1 = ERROR [2,3]+1 ✗ 
+ +The same problem with most `f :: a -> F a` functions and functor `F`. diff --git a/categories/30_How/200_Monads/060_Composition_Fixable.html b/categories/30_How/200_Monads/060_Composition_Fixable.html new file mode 100644 index 0000000..a31b901 --- /dev/null +++ b/categories/30_How/200_Monads/060_Composition_Fixable.html @@ -0,0 +1,6 @@ +

Composition Fixable?

+

How to fix that? We want to construct an operator which is able to compose:

+

f :: a -> F b & g :: b -> F c.

+

More specifically we want to create an operator ◎ of type

+

◎ :: (b -> F c) -> (a -> F b) -> (a -> F c)

+

Note: if F = I, ◎ = (.).

diff --git a/categories/30_How/200_Monads/060_Composition_Fixable.md b/categories/30_How/200_Monads/060_Composition_Fixable.md new file mode 100644 index 0000000..fb7ea47 --- /dev/null +++ b/categories/30_How/200_Monads/060_Composition_Fixable.md @@ -0,0 +1,12 @@ +Composition Fixable? +-------------------------------------------- + +How to fix that? We want to construct an operator which is able to compose: + +`f :: a -> F b` & `g :: b -> F c`. + +More specifically we want to create an operator ◎ of type + +`◎ :: (b -> F c) -> (a -> F b) -> (a -> F c)` + +Note: if `F` = I, ◎ = `(.)`. diff --git a/categories/30_How/200_Monads/070_Fix_Composition_1_2.html b/categories/30_How/200_Monads/070_Fix_Composition_1_2.html new file mode 100644 index 0000000..f9e7205 --- /dev/null +++ b/categories/30_How/200_Monads/070_Fix_Composition_1_2.html @@ -0,0 +1,7 @@ +

Fix Composition (1/2)

+

Goal, find: ◎ :: (b -> F c) -> (a -> F b) -> (a -> F c)
f :: a -> F b, g :: b -> F c:

+ diff --git a/categories/30_How/200_Monads/070_Fix_Composition_1_2.md b/categories/30_How/200_Monads/070_Fix_Composition_1_2.md new file mode 100644 index 0000000..9b6709a --- /dev/null +++ b/categories/30_How/200_Monads/070_Fix_Composition_1_2.md @@ -0,0 +1,9 @@ +Fix Composition (1/2) +-------------------------------------------- + +Goal, find: `◎ :: (b -> F c) -> (a -> F b) -> (a -> F c)` +`f :: a -> F b`, `g :: b -> F c`: + +- `(g ◎ f) x` ??? +- First apply `f` to `x` ⇒ `f x :: F b` +- Then how to apply `g` properly to an element of type `F b`? diff --git a/categories/30_How/200_Monads/080_Fix_Composition_2_2.html b/categories/30_How/200_Monads/080_Fix_Composition_2_2.html new file mode 100644 index 0000000..a4c9e17 --- /dev/null +++ b/categories/30_How/200_Monads/080_Fix_Composition_2_2.html @@ -0,0 +1,9 @@ +

Fix Composition (2/2)

+

Goal, find: ◎ :: (b -> F c) -> (a -> F b) -> (a -> F c)
f :: a -> F b, g :: b -> F c, f x :: F b:

+ diff --git a/categories/30_How/200_Monads/080_Fix_Composition_2_2.md b/categories/30_How/200_Monads/080_Fix_Composition_2_2.md new file mode 100644 index 0000000..054a5a7 --- /dev/null +++ b/categories/30_How/200_Monads/080_Fix_Composition_2_2.md @@ -0,0 +1,12 @@ +Fix Composition (2/2) +-------------------------------------------- + +Goal, find: `◎ :: (b -> F c) -> (a -> F b) -> (a -> F c)` +`f :: a -> F b`, `g :: b -> F c`, `f x :: F b`: + +- Use `fmap :: (t -> u) -> (F t -> F u)`! +- `(fmap g) :: F b -> F (F c)` ; (`t=b`, `u=F c`) +- `(fmap g) (f x) :: F (F c)` it almost WORKS! +- We lack an important component, `join :: F (F c) -> F c` +- `(g ◎ f) x = join ((fmap g) (f x))` ☺ +◎ is the Kleisli composition; in Haskell: `<=<` (in `Control.Monad`). diff --git a/categories/30_How/200_Monads/090_Necessary_laws.html b/categories/30_How/200_Monads/090_Necessary_laws.html new file mode 100644 index 0000000..0debe6b --- /dev/null +++ b/categories/30_How/200_Monads/090_Necessary_laws.html @@ -0,0 +1,7 @@ +

Necessary laws

+

For ◎ to work like composition, we need join to hold the following properties:

+ diff --git a/categories/30_How/200_Monads/090_Necessary_laws.md b/categories/30_How/200_Monads/090_Necessary_laws.md new file mode 100644 index 0000000..5b60b0c --- /dev/null +++ b/categories/30_How/200_Monads/090_Necessary_laws.md @@ -0,0 +1,10 @@ +Necessary laws +-------------------------------------------- + +For ◎ to work like composition, we need join to hold the following properties: + +- `join (join (F (F (F a))))=join (F (join (F (F a))))` +- abusing notations denoting `join` by ⊙; this is equivalent to +`(F ⊙ F) ⊙ F = F ⊙ (F ⊙ F)` +- There exists `η :: a -> F a` s.t. +`η⊙F=F=F⊙η` diff --git a/categories/30_How/200_Monads/100_Klesli_composition.html b/categories/30_How/200_Monads/100_Klesli_composition.html new file mode 100644 index 0000000..359c8ad --- /dev/null +++ b/categories/30_How/200_Monads/100_Klesli_composition.html @@ -0,0 +1,8 @@ +

Klesli composition

+

Now the composition works as expected. In Haskell ◎ is <=< in Control.Monad.

+

g <=< f = \x -> join ((fmap g) (f x))

+
f x = [x]       ⇒ f 1 = [1]   ⇒ (f <=< f) 1 = [1] ✓
+g x = [x+1]     ⇒ g 1 = [2]   ⇒ (g <=< g) 1 = [3] ✓
+h x = [x+1,x*3] ⇒ h 1 = [2,3] ⇒ (h <=< h) 1 = [3,6,4,9] ✓
+ + diff --git a/categories/30_How/200_Monads/100_Klesli_composition.md b/categories/30_How/200_Monads/100_Klesli_composition.md new file mode 100644 index 0000000..0b0d53f --- /dev/null +++ b/categories/30_How/200_Monads/100_Klesli_composition.md @@ -0,0 +1,10 @@ +Klesli composition +------------------ + +Now the composition works as expected. In Haskell ◎ is `<=<` in `Control.Monad`. + +`g <=< f = \x -> join ((fmap g) (f x))` + +
f x = [x]       ⇒ f 1 = [1]   ⇒ (f <=< f) 1 = [1] ✓
+g x = [x+1]     ⇒ g 1 = [2]   ⇒ (g <=< g) 1 = [3] ✓
+h x = [x+1,x*3] ⇒ h 1 = [2,3] ⇒ (h <=< h) 1 = [3,6,4,9] ✓
diff --git a/categories/30_How/200_Monads/110_We_reinvented_Monads.html b/categories/30_How/200_Monads/110_We_reinvented_Monads.html new file mode 100644 index 0000000..17c760d --- /dev/null +++ b/categories/30_How/200_Monads/110_We_reinvented_Monads.html @@ -0,0 +1,12 @@ +

We reinvented Monads!

+

A monad is a triplet (M,⊙,η) where

+ +

Satisfying

+ diff --git a/categories/30_How/200_Monads/110_We_reinvented_Monads.md b/categories/30_How/200_Monads/110_We_reinvented_Monads.md new file mode 100644 index 0000000..72de83b --- /dev/null +++ b/categories/30_How/200_Monads/110_We_reinvented_Monads.md @@ -0,0 +1,13 @@ +We reinvented Monads! +--------------------- + +A monad is a triplet `(M,⊙,η)` where + +- \\(M\\) an Endofunctor (to type `a` associate `M a`) +- \\(⊙:M×M→M\\) a nat. trans. (i.e. `⊙::M (M a) → M a` ; `join`) +- \\(η:I→M\\) a nat. trans. (\\(I\\) identity functor ; `η::a → M a`) + +Satisfying + +- \\(M ⊙ (M ⊙ M) = (M ⊙ M) ⊙ M\\) +- \\(η ⊙ M = M = M ⊙ η\\) diff --git a/categories/30_How/200_Monads/120_Compare_with_Monoid.html b/categories/30_How/200_Monads/120_Compare_with_Monoid.html new file mode 100644 index 0000000..699e9d4 --- /dev/null +++ b/categories/30_How/200_Monads/120_Compare_with_Monoid.html @@ -0,0 +1,12 @@ +

Compare with Monoid

+

A Monoid is a triplet \((E,∙,e)\) s.t.

+ +

Satisfying

+ diff --git a/categories/30_How/200_Monads/120_Compare_with_Monoid.md b/categories/30_How/200_Monads/120_Compare_with_Monoid.md new file mode 100644 index 0000000..7e65590 --- /dev/null +++ b/categories/30_How/200_Monads/120_Compare_with_Monoid.md @@ -0,0 +1,13 @@ +Compare with Monoid +------------------- + +A Monoid is a triplet \\((E,∙,e)\\) s.t. + +- \\(E\\) a set +- \\(∙:E×E→E\\) +- \\(e:1→E\\) + +Satisfying + +- \\(x∙(y∙z) = (x∙y)∙z, ∀x,y,z∈E\\) +- \\(e∙x = x = x∙e, ∀x∈E\\) diff --git a/categories/30_How/200_Monads/130_Monads_are_just_Monoids.html b/categories/30_How/200_Monads/130_Monads_are_just_Monoids.html new file mode 100644 index 0000000..3188747 --- /dev/null +++ b/categories/30_How/200_Monads/130_Monads_are_just_Monoids.html @@ -0,0 +1,8 @@ +

Monads are just Monoids

+
+

A Monad is just a monoid in the category of endofunctors, what's the problem?

+
+

The real sentence was:

+
+

All told, a monad in X is just a monoid in the category of endofunctors of X, with product × replaced by composition of endofunctors and unit set by the identity endofunctor.

+
diff --git a/categories/30_How/200_Monads/130_Monads_are_just_Monoids.md b/categories/30_How/200_Monads/130_Monads_are_just_Monoids.md new file mode 100644 index 0000000..12ae4ee --- /dev/null +++ b/categories/30_How/200_Monads/130_Monads_are_just_Monoids.md @@ -0,0 +1,10 @@ +Monads are just Monoids +----------------------- + +> A Monad is just a monoid in the category of endofunctors, what's the problem? + +The real sentence was: + +> All told, a monad in X is just a monoid in the category of endofunctors of X, +> with product × replaced by composition of endofunctors +> and unit set by the identity endofunctor. diff --git a/categories/30_How/200_Monads/140_Example_List.html b/categories/30_How/200_Monads/140_Example_List.html new file mode 100644 index 0000000..03bb7d3 --- /dev/null +++ b/categories/30_How/200_Monads/140_Example_List.html @@ -0,0 +1,15 @@ +

Example: List

+ +
-- In Haskell ⊙ is "join" in "Control.Monad"
+join :: [[a]] -> [a]
+join = concat
+
+-- In Haskell the "return" function (unfortunate name)
+η :: a -> [a]
+η x = [x]
+ + diff --git a/categories/30_How/200_Monads/140_Example_List.md b/categories/30_How/200_Monads/140_Example_List.md new file mode 100644 index 0000000..db407bd --- /dev/null +++ b/categories/30_How/200_Monads/140_Example_List.md @@ -0,0 +1,14 @@ +Example: List +------------- + +- `[] :: * -> *` an Endofunctor +- \\(⊙:M×M→M\\) a nat. trans. (`join :: M (M a) -> M a`) +- \\(η:I→M\\) a nat. trans. + +
-- In Haskell ⊙ is "join" in "Control.Monad"
+join :: [[a]] -> [a]
+join = concat
+
+-- In Haskell the "return" function (unfortunate name)
+η :: a -> [a]
+η x = [x]
diff --git a/categories/30_How/200_Monads/150_Example_List_law_verification.html b/categories/30_How/200_Monads/150_Example_List_law_verification.html new file mode 100644 index 0000000..4afa498 --- /dev/null +++ b/categories/30_How/200_Monads/150_Example_List_law_verification.html @@ -0,0 +1,11 @@ +

Example: List (law verification)

+

Example: List is a functor (join is ⊙)

+ +
join [ join [[x,y,...,z]] ] = join [[x,y,...,z]]
+                            = join (join [[[x,y,...,z]]])
+join (η [x]) = [x] = join [η x]
+ +

Therefore ([],join,η) is a monad.

diff --git a/categories/30_How/200_Monads/150_Example_List_law_verification.md b/categories/30_How/200_Monads/150_Example_List_law_verification.md new file mode 100644 index 0000000..d287edc --- /dev/null +++ b/categories/30_How/200_Monads/150_Example_List_law_verification.md @@ -0,0 +1,13 @@ +Example: List (law verification) +-------------------------------- + +Example: `List` is a functor (`join` is ⊙) + +- \\(M ⊙ (M ⊙ M) = (M ⊙ M) ⊙ M\\) +- \\(η ⊙ M = M = M ⊙ η\\) + +
join [ join [[x,y,...,z]] ] = join [[x,y,...,z]]
+							= join (join [[[x,y,...,z]]])
+join (η [x]) = [x] = join [η x]
+ +Therefore `([],join,η)` is a monad. diff --git a/categories/30_How/200_Monads/160_Monads_useful.html b/categories/30_How/200_Monads/160_Monads_useful.html new file mode 100644 index 0000000..96508e6 --- /dev/null +++ b/categories/30_How/200_Monads/160_Monads_useful.html @@ -0,0 +1,28 @@ +

Monads useful?

+

A LOT of monad tutorial on the net. Just one example; the State Monad

+

DrawScene to State Screen DrawScene ; still pure.

+
main = drawImage (width,height)
+
+drawImage :: Screen -> DrawScene
+drawImage screen =
+    drawPoint p screen
+    drawCircle c screen
+    drawRectangle r screen
+
+drawPoint point screen = ...
+drawCircle circle screen = ...
+drawRectangle rectangle screen = ...
+
main = do
+    put (Screen 1024 768)
+    drawImage
+
+drawImage :: State Screen DrawScene
+drawImage = do
+    drawPoint p
+    drawCircle c
+    drawRectangle r
+
+drawPoint :: Point -> State Screen DrawScene
+drawPoint p = do
+    Screen width height <- get
+    ...
diff --git a/categories/30_How/300_Catamorphisms/010_fold.html b/categories/30_How/300_Catamorphisms/010_fold.html new file mode 100644 index 0000000..b34ea5e --- /dev/null +++ b/categories/30_How/300_Catamorphisms/010_fold.html @@ -0,0 +1,2 @@ +

fold

+fold diff --git a/categories/30_How/300_Catamorphisms/010_fold.md b/categories/30_How/300_Catamorphisms/010_fold.md new file mode 100644 index 0000000..2149f75 --- /dev/null +++ b/categories/30_How/300_Catamorphisms/010_fold.md @@ -0,0 +1,4 @@ +`fold` +------ + +fold diff --git a/categories/30_How/300_Catamorphisms/020_morphism.html b/categories/30_How/300_Catamorphisms/020_morphism.html new file mode 100644 index 0000000..8a865c1 --- /dev/null +++ b/categories/30_How/300_Catamorphisms/020_morphism.html @@ -0,0 +1,2 @@ +

κατα-morphism

+catamorphism diff --git a/categories/30_How/300_Catamorphisms/020_morphism.md b/categories/30_How/300_Catamorphisms/020_morphism.md new file mode 100644 index 0000000..cc23a2f --- /dev/null +++ b/categories/30_How/300_Catamorphisms/020_morphism.md @@ -0,0 +1,4 @@ +κατα-morphism +------------- + +catamorphism diff --git a/categories/30_How/300_Catamorphisms/030_morphism_fold_generalization.html b/categories/30_How/300_Catamorphisms/030_morphism_fold_generalization.html new file mode 100644 index 0000000..cee12a2 --- /dev/null +++ b/categories/30_How/300_Catamorphisms/030_morphism_fold_generalization.html @@ -0,0 +1,13 @@ +

κατα-morphism: fold generalization

+

acc type of the "accumulator":
fold :: (acc -> a -> acc) -> acc -> [a] -> acc

+

Idea: put the accumulated value inside the type.

+
-- Equivalent to fold (+1) 0 "cata"
+(Cons 'c' (Cons 'a' (Cons 't' (Cons 'a' Nil))))
+(Cons 'c' (Cons 'a' (Cons 't' (Cons 'a' 0))))
+(Cons 'c' (Cons 'a' (Cons 't' 1)))
+(Cons 'c' (Cons 'a' 2))
+(Cons 'c' 3)
+4
+ + +

But where are all the informations? (+1) and 0?

diff --git a/categories/30_How/300_Catamorphisms/030_morphism_fold_generalization.md b/categories/30_How/300_Catamorphisms/030_morphism_fold_generalization.md new file mode 100644 index 0000000..c93a807 --- /dev/null +++ b/categories/30_How/300_Catamorphisms/030_morphism_fold_generalization.md @@ -0,0 +1,18 @@ +κατα-morphism: fold generalization +---------------------------------- + +`acc` type of the "accumulator": +`fold :: (acc -> a -> acc) -> acc -> [a] -> acc` + +Idea: put the accumulated value inside the type. + +
-- Equivalent to fold (+1) 0 "cata"
+(Cons 'c' (Cons 'a' (Cons 't' (Cons 'a' Nil))))
+(Cons 'c' (Cons 'a' (Cons 't' (Cons 'a' 0))))
+(Cons 'c' (Cons 'a' (Cons 't' 1)))
+(Cons 'c' (Cons 'a' 2))
+(Cons 'c' 3)
+4
+ + +But where are all the informations? `(+1)` and `0`? diff --git a/categories/30_How/300_Catamorphisms/040_morphism_Missing_Information.html b/categories/30_How/300_Catamorphisms/040_morphism_Missing_Information.html new file mode 100644 index 0000000..8a6ae9f --- /dev/null +++ b/categories/30_How/300_Catamorphisms/040_morphism_Missing_Information.html @@ -0,0 +1,7 @@ +

κατα-morphism: Missing Information

+

Where is the missing information?

+ +

First example, make length on [Char]

diff --git a/categories/30_How/300_Catamorphisms/040_morphism_Missing_Information.md b/categories/30_How/300_Catamorphisms/040_morphism_Missing_Information.md new file mode 100644 index 0000000..d0eed85 --- /dev/null +++ b/categories/30_How/300_Catamorphisms/040_morphism_Missing_Information.md @@ -0,0 +1,9 @@ +κατα-morphism: Missing Information +---------------------------------- + +Where is the missing information? + +- Functor operator `fmap` +- Algebra representing the `(+1)` and also knowing the `0`. + +First example, make `length` on `[Char]` diff --git a/categories/30_How/300_Catamorphisms/050_morphism_Type_work.html b/categories/30_How/300_Catamorphisms/050_morphism_Type_work.html new file mode 100644 index 0000000..540a31b --- /dev/null +++ b/categories/30_How/300_Catamorphisms/050_morphism_Type_work.html @@ -0,0 +1,18 @@ +

κατα-morphism: Type work

+

+data StrF a = Cons Char a | Nil
+data Str = StrF Str
+
+-- generalize the construction of Str to other datatype
+-- Mu :: type fixed point
+
+data Mu f = InF { outF :: f (Mu f) }
+data Str = Mu StrF
+
+-- Example
+foo=InF { outF = Cons 'f'
+        (InF { outF = Cons 'o'
+            (InF { outF = Cons 'o'
+                (InF { outF = Nil })})})}
+ + diff --git a/categories/30_How/300_Catamorphisms/050_morphism_Type_work.md b/categories/30_How/300_Catamorphisms/050_morphism_Type_work.md new file mode 100644 index 0000000..b43e653 --- /dev/null +++ b/categories/30_How/300_Catamorphisms/050_morphism_Type_work.md @@ -0,0 +1,18 @@ +κατα-morphism: Type work +------------------------ + +

+data StrF a = Cons Char a | Nil
+data Str = StrF Str
+
+-- generalize the construction of Str to other datatype
+-- Mu :: type fixed point
+
+data Mu f = InF { outF :: f (Mu f) }
+data Str = Mu StrF
+
+-- Example
+foo=InF { outF = Cons 'f'
+		(InF { outF = Cons 'o'
+			(InF { outF = Cons 'o'
+				(InF { outF = Nil })})})}
diff --git a/categories/30_How/300_Catamorphisms/060_morphism_missing_information_retrieved.html b/categories/30_How/300_Catamorphisms/060_morphism_missing_information_retrieved.html new file mode 100644 index 0000000..b138384 --- /dev/null +++ b/categories/30_How/300_Catamorphisms/060_morphism_missing_information_retrieved.html @@ -0,0 +1,7 @@ +

κατα-morphism: missing information retrieved

+
type Algebra f a = f a -> a
+instance Functor (StrF a) =
+    fmap f (Cons c x) = Cons c (f x)
+    fmap _ Nil = Nil
+
cata :: Functor f => Algebra f a -> Mu f -> a
+cata f = f . fmap (cata f) . outF
diff --git a/categories/30_How/300_Catamorphisms/060_morphism_missing_information_retrieved.md b/categories/30_How/300_Catamorphisms/060_morphism_missing_information_retrieved.md new file mode 100644 index 0000000..5f4b18b --- /dev/null +++ b/categories/30_How/300_Catamorphisms/060_morphism_missing_information_retrieved.md @@ -0,0 +1,15 @@ +κατα-morphism: missing information retrieved +-------------------------------------------- + +~~~ +type Algebra f a = f a -> a +instance Functor (StrF a) = + fmap f (Cons c x) = Cons c (f x) + fmap _ Nil = Nil +~~~ + +~~~ +cata :: Functor f => Algebra f a -> Mu f -> a +cata f = f . fmap (cata f) . outF +~~~ + diff --git a/categories/30_How/300_Catamorphisms/070_morphism_Finally_length.html b/categories/30_How/300_Catamorphisms/070_morphism_Finally_length.html new file mode 100644 index 0000000..e726f0f --- /dev/null +++ b/categories/30_How/300_Catamorphisms/070_morphism_Finally_length.html @@ -0,0 +1,15 @@ +

κατα-morphism: Finally length

+

All needed information for making length.

+
instance Functor (StrF a) =
+    fmap f (Cons c x) = Cons c (f x)
+    fmap _ Nil = Nil
+
+length' :: Str -> Int
+length' = cata phi where
+    phi :: Algebra StrF Int -- StrF Int -> Int
+    phi (Cons a b) = 1 + b
+    phi Nil = 0
+
+main = do
+    l <- length' $ stringToStr "Toto"
+    ...
diff --git a/categories/30_How/300_Catamorphisms/070_morphism_Finally_length.md b/categories/30_How/300_Catamorphisms/070_morphism_Finally_length.md new file mode 100644 index 0000000..c136323 --- /dev/null +++ b/categories/30_How/300_Catamorphisms/070_morphism_Finally_length.md @@ -0,0 +1,20 @@ +κατα-morphism: Finally length +----------------------------- + +All needed information for making length. + +~~~ +instance Functor (StrF a) = + fmap f (Cons c x) = Cons c (f x) + fmap _ Nil = Nil + +length' :: Str -> Int +length' = cata phi where + phi :: Algebra StrF Int -- StrF Int -> Int + phi (Cons a b) = 1 + b + phi Nil = 0 + +main = do + l <- length' $ stringToStr "Toto" + ... +~~~ diff --git a/categories/30_How/300_Catamorphisms/080_morphism_extension_to_Trees.html b/categories/30_How/300_Catamorphisms/080_morphism_extension_to_Trees.html new file mode 100644 index 0000000..68b8430 --- /dev/null +++ b/categories/30_How/300_Catamorphisms/080_morphism_extension_to_Trees.html @@ -0,0 +1,11 @@ +

κατα-morphism: extension to Trees

+

Once you get the trick, it is easy to extent to most Functor.

+
type Tree = Mu TreeF
+data TreeF x = Node Int [x]
+
+instance Functor TreeF where
+  fmap f (Node e xs) = Node e (fmap f xs)
+
+depth = cata phi where
+  phi :: Algebra TreeF Int -- TreeF Int -> Int
+  phi (Node x sons) = 1 + foldr max 0 sons
diff --git a/categories/30_How/300_Catamorphisms/080_morphism_extension_to_Trees.md b/categories/30_How/300_Catamorphisms/080_morphism_extension_to_Trees.md new file mode 100644 index 0000000..39a6269 --- /dev/null +++ b/categories/30_How/300_Catamorphisms/080_morphism_extension_to_Trees.md @@ -0,0 +1,16 @@ +κατα-morphism: extension to Trees +---------------------------------- + +Once you get the trick, it is easy to extent to most Functor. + +~~~ +type Tree = Mu TreeF +data TreeF x = Node Int [x] + +instance Functor TreeF where + fmap f (Node e xs) = Node e (fmap f xs) + +depth = cata phi where + phi :: Algebra TreeF Int -- TreeF Int -> Int + phi (Node x sons) = 1 + foldr max 0 sons +~~~ diff --git a/categories/40_Conclusion/010_Conclusion.html b/categories/40_Conclusion/010_Conclusion.html new file mode 100644 index 0000000..1dba2f7 --- /dev/null +++ b/categories/40_Conclusion/010_Conclusion.html @@ -0,0 +1,8 @@ +

Conclusion

+

Category Theory oriented Programming:

+ diff --git a/categories/40_Conclusion/010_Conclusion.md b/categories/40_Conclusion/010_Conclusion.md new file mode 100644 index 0000000..4466ee6 --- /dev/null +++ b/categories/40_Conclusion/010_Conclusion.md @@ -0,0 +1,9 @@ +Conclusion +---------- + +Category Theory oriented Programming: + +- Focus on the type and operators +- Extreme generalisation +- Better modularity +- Better control through properties of types diff --git a/categories/gen b/categories/gen new file mode 100755 index 0000000..925fd6c --- /dev/null +++ b/categories/gen @@ -0,0 +1,28 @@ +#!/usr/bin/env zsh + +# get script directory +if [[ ${0[0]} = '/' ]]; then + scriptdir="${0:h}" +else + scriptdir="$PWD/${0:h}" +fi + +cd $scriptdir + +# Convert all slides from markdown +for slide in **/*.md(.N); do + pandoc -f markdown -t html $slide > ${slide:r}.html +done + +{ +cat head.html +for slide in **/*.html(.N); do + case $slide in + head.html|tail.html) continue + esac + print -- '
' + cat $slide | sed 's#&#&#g' + print -- '
' +done +cat tail.html +} > ../categories.html diff --git a/categories/head.html b/categories/head.html new file mode 100644 index 0000000..f183882 --- /dev/null +++ b/categories/head.html @@ -0,0 +1,68 @@ + + + + + + + + Category Theory for Programming + + + + + + + + + + + + + + + + + + + + + + + + + +
+\(\newcommand{\F}{\mathbf{F}}\) +\(\newcommand{\E}{\mathbf{E}}\) +\(\newcommand{\C}{\mathcal{C}}\) +\(\newcommand{\D}{\mathcal{D}}\) +\(\newcommand{\id}{\mathrm{id}}\) +\(\newcommand{\ob}[1]{\mathrm{ob}(#1)}\) +\(\newcommand{\hom}[1]{\mathrm{hom}(#1)}\) +\(\newcommand{\Set}{\mathbf{Set}}\) +\(\newcommand{\Mon}{\mathbf{Mon}}\) +\(\newcommand{\Vec}{\mathbf{Vec}}\) +\(\newcommand{\Grp}{\mathbf{Grp}}\) +\(\newcommand{\Rng}{\mathbf{Rng}}\) +\(\newcommand{\ML}{\mathbf{ML}}\) +\(\newcommand{\Hask}{\mathbf{Hask}}\) +\(\newcommand{\Cat}{\mathbf{Cat}}\) +\(\newcommand{\fmap}{\mathtt{fmap}}\) +
+ + + diff --git a/categories/img/basket_of_cats.jpg b/categories/img/basket_of_cats.jpg new file mode 100644 index 0000000..5e704cd Binary files /dev/null and b/categories/img/basket_of_cats.jpg differ diff --git a/categories/img/batquestion.jpg b/categories/img/batquestion.jpg new file mode 100644 index 0000000..9b5a397 Binary files /dev/null and b/categories/img/batquestion.jpg differ diff --git a/categories/img/buddha.gif b/categories/img/buddha.gif new file mode 100644 index 0000000..3d18bde Binary files /dev/null and b/categories/img/buddha.gif differ diff --git a/categories/img/categlory.jpg b/categories/img/categlory.jpg new file mode 100644 index 0000000..a3fd21f Binary files /dev/null and b/categories/img/categlory.jpg differ diff --git a/categories/img/cats-everywhere.jpg b/categories/img/cats-everywhere.jpg new file mode 100644 index 0000000..792995a Binary files /dev/null and b/categories/img/cats-everywhere.jpg differ diff --git a/categories/img/earth_catamorphed.gif b/categories/img/earth_catamorphed.gif new file mode 100644 index 0000000..734db02 Binary files /dev/null and b/categories/img/earth_catamorphed.gif differ diff --git a/categories/img/egyptian-hieroglyphics.jpg b/categories/img/egyptian-hieroglyphics.jpg new file mode 100644 index 0000000..471ab86 Binary files /dev/null and b/categories/img/egyptian-hieroglyphics.jpg differ diff --git a/categories/img/eilenberg.gif b/categories/img/eilenberg.gif new file mode 100644 index 0000000..cf07d08 Binary files /dev/null and b/categories/img/eilenberg.gif differ diff --git a/categories/img/first-real-numbers.png b/categories/img/first-real-numbers.png new file mode 100644 index 0000000..c0e57b0 Binary files /dev/null and b/categories/img/first-real-numbers.png differ diff --git a/categories/img/fractalcat.jpg b/categories/img/fractalcat.jpg new file mode 100644 index 0000000..683fbc6 Binary files /dev/null and b/categories/img/fractalcat.jpg differ diff --git a/categories/img/functor-cat.gif b/categories/img/functor-cat.gif new file mode 100644 index 0000000..a7e9a21 Binary files /dev/null and b/categories/img/functor-cat.gif differ diff --git a/categories/img/isomorph-cats.jpg b/categories/img/isomorph-cats.jpg new file mode 100644 index 0000000..8ba8701 Binary files /dev/null and b/categories/img/isomorph-cats.jpg differ diff --git a/categories/img/lolcat.jpg b/categories/img/lolcat.jpg new file mode 100644 index 0000000..152f879 Binary files /dev/null and b/categories/img/lolcat.jpg differ diff --git a/categories/img/maclaine.jpg b/categories/img/maclaine.jpg new file mode 100644 index 0000000..797d6e5 Binary files /dev/null and b/categories/img/maclaine.jpg differ diff --git a/categories/img/mindblown.gif b/categories/img/mindblown.gif new file mode 100644 index 0000000..b6f5c3b Binary files /dev/null and b/categories/img/mindblown.gif differ diff --git a/categories/img/mp/associativecomposition.png b/categories/img/mp/associativecomposition.png new file mode 100644 index 0000000..1e6a1a6 Binary files /dev/null and b/categories/img/mp/associativecomposition.png differ diff --git a/categories/img/mp/boxfunctor.png b/categories/img/mp/boxfunctor.png new file mode 100644 index 0000000..1983857 Binary files /dev/null and b/categories/img/mp/boxfunctor.png differ diff --git a/categories/img/mp/cat-example1.png b/categories/img/mp/cat-example1.png new file mode 100644 index 0000000..b6b37a5 Binary files /dev/null and b/categories/img/mp/cat-example1.png differ diff --git a/categories/img/mp/cat-example2.png b/categories/img/mp/cat-example2.png new file mode 100644 index 0000000..c64c8c5 Binary files /dev/null and b/categories/img/mp/cat-example2.png differ diff --git a/categories/img/mp/cat-example3.png b/categories/img/mp/cat-example3.png new file mode 100644 index 0000000..c7fca37 Binary files /dev/null and b/categories/img/mp/cat-example3.png differ diff --git a/categories/img/mp/cat-example4.png b/categories/img/mp/cat-example4.png new file mode 100644 index 0000000..f922c8a Binary files /dev/null and b/categories/img/mp/cat-example4.png differ diff --git a/categories/img/mp/cat-example5.png b/categories/img/mp/cat-example5.png new file mode 100644 index 0000000..0da464e Binary files /dev/null and b/categories/img/mp/cat-example5.png differ diff --git a/categories/img/mp/cat-hask-endofunctor.png b/categories/img/mp/cat-hask-endofunctor.png new file mode 100644 index 0000000..d097711 Binary files /dev/null and b/categories/img/mp/cat-hask-endofunctor.png differ diff --git a/categories/img/mp/commutative-diagram-assoc.png b/categories/img/mp/commutative-diagram-assoc.png new file mode 100644 index 0000000..475d27e Binary files /dev/null and b/categories/img/mp/commutative-diagram-assoc.png differ diff --git a/categories/img/mp/commutative-diagram-id.png b/categories/img/mp/commutative-diagram-id.png new file mode 100644 index 0000000..7dd1a9f Binary files /dev/null and b/categories/img/mp/commutative-diagram-id.png differ diff --git a/categories/img/mp/composition.png b/categories/img/mp/composition.png new file mode 100644 index 0000000..5b57b65 Binary files /dev/null and b/categories/img/mp/composition.png differ diff --git a/categories/img/mp/endofunctor.png b/categories/img/mp/endofunctor.png new file mode 100644 index 0000000..7319ee2 Binary files /dev/null and b/categories/img/mp/endofunctor.png differ diff --git a/categories/img/mp/functor-morphism-color.png b/categories/img/mp/functor-morphism-color.png new file mode 100644 index 0000000..4474d45 Binary files /dev/null and b/categories/img/mp/functor-morphism-color.png differ diff --git a/categories/img/mp/functor-morphism.png b/categories/img/mp/functor-morphism.png new file mode 100644 index 0000000..4cbe0b4 Binary files /dev/null and b/categories/img/mp/functor-morphism.png differ diff --git a/categories/img/mp/functor.png b/categories/img/mp/functor.png new file mode 100644 index 0000000..48339b3 Binary files /dev/null and b/categories/img/mp/functor.png differ diff --git a/categories/img/mp/graph-category.png b/categories/img/mp/graph-category.png new file mode 100644 index 0000000..a1aeed0 Binary files /dev/null and b/categories/img/mp/graph-category.png differ diff --git a/categories/img/mp/hask-endofunctor-morphisms.png b/categories/img/mp/hask-endofunctor-morphisms.png new file mode 100644 index 0000000..fb60525 Binary files /dev/null and b/categories/img/mp/hask-endofunctor-morphisms.png differ diff --git a/categories/img/mp/hask-endofunctor-objects.png b/categories/img/mp/hask-endofunctor-objects.png new file mode 100644 index 0000000..6308f9c Binary files /dev/null and b/categories/img/mp/hask-endofunctor-objects.png differ diff --git a/categories/img/mp/hask-endofunctor.png b/categories/img/mp/hask-endofunctor.png new file mode 100644 index 0000000..53cf05b Binary files /dev/null and b/categories/img/mp/hask-endofunctor.png differ diff --git a/categories/img/mp/hask.png b/categories/img/mp/hask.png new file mode 100644 index 0000000..016474c Binary files /dev/null and b/categories/img/mp/hask.png differ diff --git a/categories/img/mp/identity.png b/categories/img/mp/identity.png new file mode 100644 index 0000000..75ef393 Binary files /dev/null and b/categories/img/mp/identity.png differ diff --git a/categories/img/mp/list-maybe-endofunctor-morphism.png b/categories/img/mp/list-maybe-endofunctor-morphism.png new file mode 100644 index 0000000..4e2797f Binary files /dev/null and b/categories/img/mp/list-maybe-endofunctor-morphism.png differ diff --git a/categories/img/mp/list-tree-endofunctor-morphism.png b/categories/img/mp/list-tree-endofunctor-morphism.png new file mode 100644 index 0000000..1e1f2c6 Binary files /dev/null and b/categories/img/mp/list-tree-endofunctor-morphism.png differ diff --git a/categories/img/mp/main.css b/categories/img/mp/main.css new file mode 100644 index 0000000..e69de29 diff --git a/categories/img/mp/maybe-list-endofunctor-morphsm.png b/categories/img/mp/maybe-list-endofunctor-morphsm.png new file mode 100644 index 0000000..7e7e8d2 Binary files /dev/null and b/categories/img/mp/maybe-list-endofunctor-morphsm.png differ diff --git a/categories/img/mp/monoid.png b/categories/img/mp/monoid.png new file mode 100644 index 0000000..b5237c9 Binary files /dev/null and b/categories/img/mp/monoid.png differ diff --git a/categories/img/mp/morphisms.png b/categories/img/mp/morphisms.png new file mode 100644 index 0000000..9200a94 Binary files /dev/null and b/categories/img/mp/morphisms.png differ diff --git a/categories/img/mp/nattrans-list-maybe.png b/categories/img/mp/nattrans-list-maybe.png new file mode 100644 index 0000000..31873f9 Binary files /dev/null and b/categories/img/mp/nattrans-list-maybe.png differ diff --git a/categories/img/mp/nattrans-list-tree.png b/categories/img/mp/nattrans-list-tree.png new file mode 100644 index 0000000..da67c69 Binary files /dev/null and b/categories/img/mp/nattrans-list-tree.png differ diff --git a/categories/img/mp/nattrans-maybe-list.png b/categories/img/mp/nattrans-maybe-list.png new file mode 100644 index 0000000..084237d Binary files /dev/null and b/categories/img/mp/nattrans-maybe-list.png differ diff --git a/categories/img/mp/nattrans-tree-list.png b/categories/img/mp/nattrans-tree-list.png new file mode 100644 index 0000000..39c2b25 Binary files /dev/null and b/categories/img/mp/nattrans-tree-list.png differ diff --git a/categories/img/mp/natural-transformation.png b/categories/img/mp/natural-transformation.png new file mode 100644 index 0000000..7289f0d Binary files /dev/null and b/categories/img/mp/natural-transformation.png differ diff --git a/categories/img/mp/numbers.png b/categories/img/mp/numbers.png new file mode 100644 index 0000000..5787004 Binary files /dev/null and b/categories/img/mp/numbers.png differ diff --git a/categories/img/mp/objects.png b/categories/img/mp/objects.png new file mode 100644 index 0000000..c5dfaaf Binary files /dev/null and b/categories/img/mp/objects.png differ diff --git a/categories/img/mp/preorder.png b/categories/img/mp/preorder.png new file mode 100644 index 0000000..fa31012 Binary files /dev/null and b/categories/img/mp/preorder.png differ diff --git a/categories/img/mp/set.png b/categories/img/mp/set.png new file mode 100644 index 0000000..dd19a85 Binary files /dev/null and b/categories/img/mp/set.png differ diff --git a/categories/img/mp/strings.png b/categories/img/mp/strings.png new file mode 100644 index 0000000..e05029b Binary files /dev/null and b/categories/img/mp/strings.png differ diff --git a/categories/img/mp/tree-list-endofunctor-morphism.png b/categories/img/mp/tree-list-endofunctor-morphism.png new file mode 100644 index 0000000..f0babea Binary files /dev/null and b/categories/img/mp/tree-list-endofunctor-morphism.png differ diff --git a/categories/img/negative-numbers.jpg b/categories/img/negative-numbers.jpg new file mode 100644 index 0000000..d41624c Binary files /dev/null and b/categories/img/negative-numbers.jpg differ diff --git a/categories/img/readingcat.jpg b/categories/img/readingcat.jpg new file mode 100644 index 0000000..d35fe01 Binary files /dev/null and b/categories/img/readingcat.jpg differ diff --git a/categories/img/tally-count.png b/categories/img/tally-count.png new file mode 100644 index 0000000..f46b8e9 Binary files /dev/null and b/categories/img/tally-count.png differ diff --git a/categories/img/tower_folded.gif b/categories/img/tower_folded.gif new file mode 100644 index 0000000..7dee0c0 Binary files /dev/null and b/categories/img/tower_folded.gif differ diff --git a/categories/renameSlideFic.sh b/categories/renameSlideFic.sh new file mode 100755 index 0000000..dc84997 --- /dev/null +++ b/categories/renameSlideFic.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env zsh + +# get script directory +if [[ ${0[0]} = '/' ]]; then + scriptdir="${0:h}" +else + scriptdir="$PWD/${0:h}" +fi + +cd $scriptdir + +for rep in **/{??,???}_*(N/); do + print "renaming html of $rep" + cd $rep + i=10 + for fic in *.html(.N); do + title=$( <$fic grep h2 | sed 's/<[^>]*>//g;s/&[^;]*;//g;s/[^a-zA-Z0-9]/_/g;s/__*/_/g;s/^_//;s/_$//;') + if ((i<100)); then + num="0$i" + else + num="$i" + fi + ((i+=10)) + newfic=${num}_$title.${fic:e} + [[ $fic == $newfic ]] && { continue } + [[ -e $newfic ]] && { + print -- "$newfic already exists!" >&2 + continue + } + mv $fic $newfic + mdfic=${fic:r}.md + newmdfic=${newfic:r}.md + [[ -e $mdfic ]] && mv $mdfic $newmdfic + done + cd $scriptdir +done diff --git a/categories/tail.html b/categories/tail.html new file mode 100644 index 0000000..8ca4ec3 --- /dev/null +++ b/categories/tail.html @@ -0,0 +1,57 @@ + + + + + + + + + + +

+ + / + +

+ + +
+ + + + +
+ + +# + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/deck.core.css b/core/deck.core.css new file mode 100644 index 0000000..823af0f --- /dev/null +++ b/core/deck.core.css @@ -0,0 +1,407 @@ +html, body { + height: 100%; + padding: 0; + margin: 0; +} + +body.deck-container { + overflow-y: auto; + position: static; +} + +.deck-container { + position: relative; + min-height: 100%; + margin: 0 auto; + padding: 0 48px; + font-size: 16px; + line-height: 1.25; + overflow: hidden; + /* Resets and base styles from HTML5 Boilerplate */ + /* End HTML5 Boilerplate adaptations */ +} +.js .deck-container { + visibility: hidden; +} +.ready .deck-container { + visibility: visible; +} +.touch .deck-container { + -webkit-text-size-adjust: none; + -moz-text-size-adjust: none; +} +.deck-container div, .deck-container span, .deck-container object, .deck-container iframe, +.deck-container h1, .deck-container h2, .deck-container h3, .deck-container h4, .deck-container h5, .deck-container h6, .deck-container p, .deck-container blockquote, .deck-container pre, +.deck-container abbr, .deck-container address, .deck-container cite, .deck-container code, .deck-container del, .deck-container dfn, .deck-container em, .deck-container img, .deck-container ins, .deck-container kbd, .deck-container q, .deck-container samp, +.deck-container small, .deck-container strong, .deck-container sub, .deck-container sup, .deck-container var, .deck-container b, .deck-container i, .deck-container dl, .deck-container dt, .deck-container dd, .deck-container ol, .deck-container ul, .deck-container li, +.deck-container fieldset, .deck-container form, .deck-container label, .deck-container legend, +.deck-container table, .deck-container caption, .deck-container tbody, .deck-container tfoot, .deck-container thead, .deck-container tr, .deck-container th, .deck-container td, +.deck-container article, .deck-container aside, .deck-container canvas, .deck-container details, .deck-container figcaption, .deck-container figure, +.deck-container footer, .deck-container header, .deck-container hgroup, .deck-container menu, .deck-container nav, .deck-container section, .deck-container summary, +.deck-container time, .deck-container mark, .deck-container audio, .deck-container video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +.deck-container article, .deck-container aside, .deck-container details, .deck-container figcaption, .deck-container figure, +.deck-container footer, .deck-container header, .deck-container hgroup, .deck-container menu, .deck-container nav, .deck-container section { + display: block; +} +.deck-container blockquote, .deck-container q { + quotes: none; +} +.deck-container blockquote:before, .deck-container blockquote:after, .deck-container q:before, .deck-container q:after { + content: ""; + content: none; +} +.deck-container ins { + background-color: #ff9; + color: #000; + text-decoration: none; +} +.deck-container mark { + background-color: #ff9; + color: #000; + font-style: italic; + font-weight: bold; +} +.deck-container del { + text-decoration: line-through; +} +.deck-container abbr[title], .deck-container dfn[title] { + border-bottom: 1px dotted; + cursor: help; +} +.deck-container table { + border-collapse: collapse; + border-spacing: 0; +} +.deck-container hr { + display: block; + height: 1px; + border: 0; + border-top: 1px solid #ccc; + margin: 1em 0; + padding: 0; +} +.deck-container input, .deck-container select { + vertical-align: middle; +} +.deck-container select, .deck-container input, .deck-container textarea, .deck-container button { + font: 99% sans-serif; +} +.deck-container pre, .deck-container code, .deck-container kbd, .deck-container samp { + font-family: monospace, sans-serif; +} +.deck-container a { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +.deck-container a:hover, .deck-container a:active { + outline: none; +} +.deck-container ul, .deck-container ol { + margin-left: 2em; + vertical-align: top; +} +.deck-container ol { + list-style-type: decimal; +} +.deck-container nav ul, .deck-container nav li { + margin: 0; + list-style: none; + list-style-image: none; +} +.deck-container small { + font-size: 85%; +} +.deck-container strong, .deck-container th { + font-weight: bold; +} +.deck-container td { + vertical-align: top; +} +.deck-container sub, .deck-container sup { + font-size: 75%; + line-height: 0; + position: relative; +} +.deck-container sup { + top: -0.5em; +} +.deck-container sub { + bottom: -0.25em; +} +.deck-container textarea { + overflow: auto; +} +.ie6 .deck-container legend, .ie7 .deck-container legend { + margin-left: -7px; +} +.deck-container input[type="radio"] { + vertical-align: text-bottom; +} +.deck-container input[type="checkbox"] { + vertical-align: bottom; +} +.ie7 .deck-container input[type="checkbox"] { + vertical-align: baseline; +} +.ie6 .deck-container input { + vertical-align: text-bottom; +} +.deck-container label, .deck-container input[type="button"], .deck-container input[type="submit"], .deck-container input[type="image"], .deck-container button { + cursor: pointer; +} +.deck-container button, .deck-container input, .deck-container select, .deck-container textarea { + margin: 0; +} +.deck-container input:invalid, .deck-container textarea:invalid { + border-radius: 1px; + -moz-box-shadow: 0px 0px 5px red; + -webkit-box-shadow: 0px 0px 5px red; + box-shadow: 0px 0px 5px red; +} +.deck-container input:invalid .no-boxshadow, .deck-container textarea:invalid .no-boxshadow { + background-color: #f0dddd; +} +.deck-container button { + width: auto; + overflow: visible; +} +.ie7 .deck-container img { + -ms-interpolation-mode: bicubic; +} +.deck-container, .deck-container select, .deck-container input, .deck-container textarea { + color: #444; +} +.deck-container a { + color: #607890; +} +.deck-container a:hover, .deck-container a:focus { + color: #036; +} +.deck-container a:link { + -webkit-tap-highlight-color: #fff; +} +.deck-container.deck-loading { + display: none; +} + +.slide { + width: auto; + min-height: 100%; + position: relative; +} +.slide h1 { + font-size: 4.5em; +} +.slide h1, .slide .vcenter { + font-weight: bold; + text-align: center; + padding-top: 1em; + max-height: 100%; +} +.csstransforms .slide h1, .csstransforms .slide .vcenter { + padding: 0 48px; + position: absolute; + left: 0; + right: 0; + top: 50%; + -webkit-transform: translate(0, -50%); + -moz-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + -o-transform: translate(0, -50%); + transform: translate(0, -50%); +} +.slide .vcenter h1 { + position: relative; + top: auto; + padding: 0; + -webkit-transform: none; + -moz-transform: none; + -ms-transform: none; + -o-transform: none; + transform: none; +} +.slide h2 { + font-size: 2.25em; + font-weight: bold; + padding-top: .5em; + margin: 0 0 .66666em 0; + border-bottom: 3px solid #888; +} +.slide h3 { + font-size: 1.4375em; + font-weight: bold; + margin-bottom: .30435em; +} +.slide h4 { + font-size: 1.25em; + font-weight: bold; + margin-bottom: .25em; +} +.slide h5 { + font-size: 1.125em; + font-weight: bold; + margin-bottom: .2222em; +} +.slide h6 { + font-size: 1em; + font-weight: bold; +} +.slide img, .slide iframe, .slide video { + display: block; + max-width: 100%; +} +.slide video, .slide iframe, .slide img { + display: block; + margin: 0 auto; +} +.slide p, .slide blockquote, .slide iframe, .slide img, .slide ul, .slide ol, .slide pre, .slide video { + margin-bottom: 1em; +} +.slide pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; + padding: 1em; + border: 1px solid #888; +} +.slide em { + font-style: italic; +} +.slide li { + padding: .25em 0; + vertical-align: middle; +} + +.deck-before, .deck-previous, .deck-next, .deck-after { + position: absolute; + left: -999em; + top: -999em; +} + +.deck-current { + z-index: 2; +} + +.slide .slide { + visibility: hidden; + position: static; + min-height: 0; +} + +.deck-child-current { + position: static; + z-index: 2; +} +.deck-child-current .slide { + visibility: hidden; +} +.deck-child-current .deck-previous, .deck-child-current .deck-before, .deck-child-current .deck-current { + visibility: visible; +} + +@media screen and (max-device-width: 480px) { + /* html { -webkit-text-size-adjust:none; -ms-text-size-adjust:none; } */ +} +@media print { + * { + background: transparent !important; + color: black !important; + text-shadow: none !important; + filter: none !important; + -ms-filter: none !important; + -webkit-box-reflect: none !important; + -moz-box-reflect: none !important; + -webkit-box-shadow: none !important; + -moz-box-shadow: none !important; + box-shadow: none !important; + } + * :before, * :after { + display: none !important; + } + + a, a:visited { + color: #444 !important; + text-decoration: underline; + } + + a[href]:after { + content: " (" attr(href) ")"; + } + + abbr[title]:after { + content: " (" attr(title) ")"; + } + + .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { + content: ""; + } + + pre, blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + + thead { + display: table-header-group; + } + + tr, img { + page-break-inside: avoid; + } + + @page { + margin: 0.5cm; +} + + p, h2, h3 { + orphans: 3; + widows: 3; + } + + h2, h3 { + page-break-after: avoid; + } + + .slide { + position: static !important; + visibility: visible !important; + display: block !important; + -webkit-transform: none !important; + -moz-transform: none !important; + -o-transform: none !important; + -ms-transform: none !important; + transform: none !important; + opacity: 1 !important; + } + + h1, .vcenter { + -webkit-transform: none !important; + -moz-transform: none !important; + -o-transform: none !important; + -ms-transform: none !important; + transform: none !important; + padding: 0 !important; + position: static !important; + } + + .deck-container > .slide { + page-break-after: always; + } + + .deck-container { + width: 100% !important; + height: auto !important; + padding: 0 !important; + display: block !important; + } + + script { + display: none; + } +} diff --git a/core/deck.core.js b/core/deck.core.js new file mode 100644 index 0000000..997942c --- /dev/null +++ b/core/deck.core.js @@ -0,0 +1,498 @@ +/*! +Deck JS - deck.core +Copyright (c) 2011 Caleb Troughton +Dual licensed under the MIT license and GPL license. +https://github.com/imakewebthings/deck.js/blob/master/MIT-license.txt +https://github.com/imakewebthings/deck.js/blob/master/GPL-license.txt +*/ + +/* +The deck.core module provides all the basic functionality for creating and +moving through a deck. It does so by applying classes to indicate the state of +the deck and its slides, allowing CSS to take care of the visual representation +of each state. It also provides methods for navigating the deck and inspecting +its state, as well as basic key bindings for going to the next and previous +slides. More functionality is provided by wholly separate extension modules +that use the API provided by core. +*/ +(function($, deck, document, undefined) { + var slides, // Array of all the uh, slides... + current, // Array index of the current slide + $container, // Keeping this cached + + events = { + /* + This event fires whenever the current slide changes, whether by way of + next, prev, or go. The callback function is passed two parameters, from + and to, equal to the indices of the old slide and the new slide + respectively. If preventDefault is called on the event within this handler + the slide change does not occur. + + $(document).bind('deck.change', function(event, from, to) { + alert('Moving from slide ' + from + ' to ' + to); + }); + */ + change: 'deck.change', + + /* + This event fires at the beginning of deck initialization, after the options + are set but before the slides array is created. This event makes a good hook + for preprocessing extensions looking to modify the deck. + */ + beforeInitialize: 'deck.beforeInit', + + /* + This event fires at the end of deck initialization. Extensions should + implement any code that relies on user extensible options (key bindings, + element selectors, classes) within a handler for this event. Native + events associated with Deck JS should be scoped under a .deck event + namespace, as with the example below: + + var $d = $(document); + $.deck.defaults.keys.myExtensionKeycode = 70; // 'h' + $d.bind('deck.init', function() { + $d.bind('keydown.deck', function(event) { + if (event.which === $.deck.getOptions().keys.myExtensionKeycode) { + // Rock out + } + }); + }); + */ + initialize: 'deck.init' + }, + + options = {}, + $d = $(document), + + /* + Internal function. Updates slide and container classes based on which + slide is the current slide. + */ + updateStates = function() { + var oc = options.classes, + osc = options.selectors.container, + old = $container.data('onSlide'), + $all = $(); + + // Container state + $container.removeClass(oc.onPrefix + old) + .addClass(oc.onPrefix + current) + .data('onSlide', current); + + // Remove and re-add child-current classes for nesting + $('.' + oc.current).parentsUntil(osc).removeClass(oc.childCurrent); + slides[current].parentsUntil(osc).addClass(oc.childCurrent); + + // Remove previous states + $.each(slides, function(i, el) { + $all = $all.add(el); + }); + $all.removeClass([ + oc.before, + oc.previous, + oc.current, + oc.next, + oc.after + ].join(" ")); + + // Add new states back in + slides[current].addClass(oc.current); + if (current > 0) { + slides[current-1].addClass(oc.previous); + } + if (current + 1 < slides.length) { + slides[current+1].addClass(oc.next); + } + if (current > 1) { + $.each(slides.slice(0, current - 1), function(i, el) { + el.addClass(oc.before); + }); + } + if (current + 2 < slides.length) { + $.each(slides.slice(current+2), function(i, el) { + el.addClass(oc.after); + }); + } + }, + + /* Methods exposed in the jQuery.deck namespace */ + methods = { + + /* + jQuery.deck(selector, options) + + selector: string | jQuery | array + options: object, optional + + Initializes the deck, using each element matched by selector as a slide. + May also be passed an array of string selectors or jQuery objects, in + which case each selector in the array is considered a slide. The second + parameter is an optional options object which will extend the default + values. + + $.deck('.slide'); + + or + + $.deck([ + '#first-slide', + '#second-slide', + '#etc' + ]); + */ + init: function(elements, opts) { + var startTouch, + tolerance, + esp = function(e) { + e.stopPropagation(); + }; + + options = $.extend(true, {}, $[deck].defaults, opts); + slides = []; + current = 0; + $container = $(options.selectors.container); + tolerance = options.touch.swipeTolerance; + + // Pre init event for preprocessing hooks + $d.trigger(events.beforeInitialize); + + // Hide the deck while states are being applied to kill transitions + $container.addClass(options.classes.loading); + + // Fill slides array depending on parameter type + if ($.isArray(elements)) { + $.each(elements, function(i, e) { + slides.push($(e)); + }); + } + else { + $(elements).each(function(i, e) { + slides.push($(e)); + }); + } + + /* Remove any previous bindings, and rebind key events */ + $d.unbind('keydown.deck').bind('keydown.deck', function(e) { + if (e.which === options.keys.next || $.inArray(e.which, options.keys.next) > -1) { + methods.next(); + e.preventDefault(); + } + else if (e.which === options.keys.previous || $.inArray(e.which, options.keys.previous) > -1) { + methods.prev(); + e.preventDefault(); + } + }) + /* Stop propagation of key events within editable elements */ + .undelegate('input, textarea, select, button, meter, progress, [contentEditable]', 'keydown', esp) + .delegate('input, textarea, select, button, meter, progress, [contentEditable]', 'keydown', esp); + + /* Bind touch events for swiping between slides on touch devices */ + $container.unbind('touchstart.deck').bind('touchstart.deck', function(e) { + if (!startTouch) { + startTouch = $.extend({}, e.originalEvent.targetTouches[0]); + } + }) + .unbind('touchmove.deck').bind('touchmove.deck', function(e) { + $.each(e.originalEvent.changedTouches, function(i, t) { + if (startTouch && t.identifier === startTouch.identifier) { + if (t.screenX - startTouch.screenX > tolerance || t.screenY - startTouch.screenY > tolerance) { + $[deck]('prev'); + startTouch = undefined; + } + else if (t.screenX - startTouch.screenX < -1 * tolerance || t.screenY - startTouch.screenY < -1 * tolerance) { + $[deck]('next'); + startTouch = undefined; + } + return false; + } + }); + e.preventDefault(); + }) + .unbind('touchend.deck').bind('touchend.deck', function(t) { + $.each(t.originalEvent.changedTouches, function(i, t) { + if (startTouch && t.identifier === startTouch.identifier) { + startTouch = undefined; + } + }); + }) + .scrollLeft(0).scrollTop(0); + + /* + Kick iframe videos, which dont like to redraw w/ transforms. + Remove this if Webkit ever fixes it. + */ + $.each(slides, function(i, $el) { + $el.unbind('webkitTransitionEnd.deck').bind('webkitTransitionEnd.deck', + function(event) { + if ($el.hasClass($[deck]('getOptions').classes.current)) { + var embeds = $(this).find('iframe').css('opacity', 0); + window.setTimeout(function() { + embeds.css('opacity', 1); + }, 100); + } + }); + }); + + if (slides.length) { + updateStates(); + } + + // Show deck again now that slides are in place + $container.removeClass(options.classes.loading); + $d.trigger(events.initialize); + }, + + /* + jQuery.deck('go', index) + + index: integer | string + + Moves to the slide at the specified index if index is a number. Index is + 0-based, so $.deck('go', 0); will move to the first slide. If index is a + string this will move to the slide with the specified id. If index is out + of bounds or doesn't match a slide id the call is ignored. + */ + go: function(index) { + var e = $.Event(events.change), + ndx; + + /* Number index, easy. */ + if (typeof index === 'number' && index >= 0 && index < slides.length) { + ndx = index; + } + /* Id string index, search for it and set integer index */ + else if (typeof index === 'string') { + $.each(slides, function(i, $slide) { + if ($slide.attr('id') === index) { + ndx = i; + return false; + } + }); + }; + + /* Out of bounds, id doesn't exist, illegal input, eject */ + if (typeof ndx === 'undefined') return; + + $d.trigger(e, [current, ndx]); + if (e.isDefaultPrevented()) { + /* Trigger the event again and undo the damage done by extensions. */ + $d.trigger(events.change, [ndx, current]); + } + else { + current = ndx; + updateStates(); + } + }, + + /* + jQuery.deck('next') + + Moves to the next slide. If the last slide is already active, the call + is ignored. + */ + next: function() { + methods.go(current+1); + }, + + /* + jQuery.deck('prev') + + Moves to the previous slide. If the first slide is already active, the + call is ignored. + */ + prev: function() { + methods.go(current-1); + }, + + /* + jQuery.deck('getSlide', index) + + index: integer, optional + + Returns a jQuery object containing the slide at index. If index is not + specified, the current slide is returned. + */ + getSlide: function(index) { + var i = typeof index !== 'undefined' ? index : current; + if (typeof i != 'number' || i < 0 || i >= slides.length) return null; + return slides[i]; + }, + + /* + jQuery.deck('getSlides') + + Returns all slides as an array of jQuery objects. + */ + getSlides: function() { + return slides; + }, + + /* + jQuery.deck('getContainer') + + Returns a jQuery object containing the deck container as defined by the + container option. + */ + getContainer: function() { + return $container; + }, + + /* + jQuery.deck('getOptions') + + Returns the options object for the deck, including any overrides that + were defined at initialization. + */ + getOptions: function() { + return options; + }, + + /* + jQuery.deck('extend', name, method) + + name: string + method: function + + Adds method to the deck namespace with the key of name. This doesn’t + give access to any private member data — public methods must still be + used within method — but lets extension authors piggyback on the deck + namespace rather than pollute jQuery. + + $.deck('extend', 'alert', function(msg) { + alert(msg); + }); + + // Alerts 'boom' + $.deck('alert', 'boom'); + */ + extend: function(name, method) { + methods[name] = method; + } + }; + + /* jQuery extension */ + $[deck] = function(method, arg) { + if (methods[method]) { + return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); + } + else { + return methods.init(method, arg); + } + }; + + /* + The default settings object for a deck. All deck extensions should extend + this object to add defaults for any of their options. + + options.classes.after + This class is added to all slides that appear after the 'next' slide. + + options.classes.before + This class is added to all slides that appear before the 'previous' + slide. + + options.classes.childCurrent + This class is added to all elements in the DOM tree between the + 'current' slide and the deck container. For standard slides, this is + mostly seen and used for nested slides. + + options.classes.current + This class is added to the current slide. + + options.classes.loading + This class is applied to the deck container during loading phases and is + primarily used as a way to short circuit transitions between states + where such transitions are distracting or unwanted. For example, this + class is applied during deck initialization and then removed to prevent + all the slides from appearing stacked and transitioning into place + on load. + + options.classes.next + This class is added to the slide immediately following the 'current' + slide. + + options.classes.onPrefix + This prefix, concatenated with the current slide index, is added to the + deck container as you change slides. + + options.classes.previous + This class is added to the slide immediately preceding the 'current' + slide. + + options.selectors.container + Elements matched by this CSS selector will be considered the deck + container. The deck container is used to scope certain states of the + deck, as with the onPrefix option, or with extensions such as deck.goto + and deck.menu. + + options.keys.next + The numeric keycode used to go to the next slide. + + options.keys.previous + The numeric keycode used to go to the previous slide. + + options.touch.swipeTolerance + The number of pixels the users finger must travel to produce a swipe + gesture. + */ + $[deck].defaults = { + classes: { + after: 'deck-after', + before: 'deck-before', + childCurrent: 'deck-child-current', + current: 'deck-current', + loading: 'deck-loading', + next: 'deck-next', + onPrefix: 'on-slide-', + previous: 'deck-previous' + }, + + selectors: { + container: '.deck-container' + }, + + keys: { + // enter, space, page down, right arrow, down arrow, + next: [13, 32, 34, 39, 40], + // backspace, page up, left arrow, up arrow + previous: [8, 33, 37, 38] + }, + + touch: { + swipeTolerance: 60 + } + }; + + $d.ready(function() { + $('html').addClass('ready'); + }); + + /* + FF + Transforms + Flash video don't get along... + Firefox will reload and start playing certain videos after a + transform. Blanking the src when a previously shown slide goes out + of view prevents this. + */ + $d.bind('deck.change', function(e, from, to) { + var oldFrames = $[deck]('getSlide', from).find('iframe'), + newFrames = $[deck]('getSlide', to).find('iframe'); + + oldFrames.each(function() { + var $this = $(this), + curSrc = $this.attr('src'); + + if(curSrc) { + $this.data('deck-src', curSrc).attr('src', ''); + } + }); + + newFrames.each(function() { + var $this = $(this), + originalSrc = $this.data('deck-src'); + + if (originalSrc) { + $this.attr('src', originalSrc); + } + }); + }); +})(jQuery, 'deck', document); diff --git a/core/deck.core.scss b/core/deck.core.scss new file mode 100755 index 0000000..6721050 --- /dev/null +++ b/core/deck.core.scss @@ -0,0 +1,450 @@ +html, body { + height:100%; + padding:0; + margin:0; +} + +body.deck-container { + overflow-y:auto; + position:static; +} + +.deck-container { + position:relative; + min-height:100%; + margin:0 auto; + padding:0 48px; + font-size:16px; + line-height:1.25; + overflow:hidden; + + .js & { + visibility:hidden; + } + + .ready & { + visibility:visible; + } + + .touch & { + -webkit-text-size-adjust:none; + -moz-text-size-adjust:none; + } + + /* Resets and base styles from HTML5 Boilerplate */ + div, span, object, iframe, + h1, h2, h3, h4, h5, h6, p, blockquote, pre, + abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, + small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, + fieldset, form, label, legend, + table, caption, tbody, tfoot, thead, tr, th, td, + article, aside, canvas, details, figcaption, figure, + footer, header, hgroup, menu, nav, section, summary, + time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; + } + + article, aside, details, figcaption, figure, + footer, header, hgroup, menu, nav, section { + display: block; + } + + blockquote, q { + quotes:none; + + &:before, &:after { + content:""; + content:none; + } + } + + ins { + background-color:#ff9; + color:#000; + text-decoration:none; + } + + mark { + background-color:#ff9; + color:#000; + font-style:italic; + font-weight:bold; + } + + del { + text-decoration:line-through; + } + + abbr[title], dfn[title] { + border-bottom:1px dotted; + cursor:help; + } + + table { + border-collapse:collapse; + border-spacing:0; + } + + hr { + display:block; + height:1px; + border:0; + border-top:1px solid #ccc; + margin:1em 0; + padding:0; + } + + input, select { + vertical-align:middle; + } + + select, input, textarea, button { + font:99% sans-serif; + } + + pre, code, kbd, samp { + font-family:monospace, sans-serif; + } + + a { + -webkit-tap-highlight-color:rgba(0,0,0,0); + + &:hover, &:active { + outline:none; + } + } + + ul, ol { + margin-left:2em; + vertical-align:top; + } + + ol { + list-style-type:decimal; + } + + nav { + ul, li { + margin:0; + list-style:none; + list-style-image:none; + } + } + + small { + font-size:85%; + } + + strong, th { + font-weight:bold; + } + + td { + vertical-align:top; + } + + sub, sup { + font-size:75%; + line-height:0; + position:relative; + } + + sup { + top:-0.5em; + } + + sub { bottom: -0.25em; } + + textarea { + overflow:auto; + } + + legend { + .ie6 &, .ie7 & { + margin-left:-7px; + } + } + + input[type="radio"] { + vertical-align:text-bottom; + } + + input[type="checkbox"] { + vertical-align:bottom; + } + + .ie7 & input[type="checkbox"] { + vertical-align:baseline; + } + + .ie6 & input { + vertical-align:text-bottom; + } + + label, input[type="button"], input[type="submit"], input[type="image"], button { + cursor:pointer; + } + + button, input, select, textarea { + margin: 0; + } + + input, textarea { + &:invalid { + border-radius:1px; + -moz-box-shadow:0px 0px 5px red; + -webkit-box-shadow:0px 0px 5px red; + box-shadow: 0px 0px 5px red; + + .no-boxshadow { + background-color: #f0dddd; + } + } + } + + button { + width:auto; + overflow:visible; + } + + .ie7 & img { + -ms-interpolation-mode: bicubic; } + + &, select, input, textarea { + color:#444; + } + + a { + color:#607890; + + &:hover, &:focus { + color:#036; + } + + &:link { + -webkit-tap-highlight-color: #fff; + } + } + /* End HTML5 Boilerplate adaptations */ + + &.deck-loading { + display:none; + } +} + +.slide { + width:auto; + min-height:100%; + position:relative; + + h1 { + font-size:4.5em; + } + + h1, .vcenter { + font-weight:bold; + text-align:center; + padding-top:1em; + max-height:100%; + + .csstransforms & { + padding:0 48px; + position:absolute; + left:0; + right:0; + top:50%; + -webkit-transform:translate(0, -50%); + -moz-transform:translate(0, -50%); + -ms-transform:translate(0, -50%); + -o-transform:translate(0, -50%); + transform:translate(0, -50%); + } + } + + .vcenter h1 { + position:relative; + top:auto; + padding:0; + -webkit-transform:none; + -moz-transform:none; + -ms-transform:none; + -o-transform:none; + transform:none; + } + + h2 { + font-size:2.25em; + font-weight:bold; + padding-top:.5em; + margin:0 0 .66666em 0; + border-bottom:3px solid #888; + } + + h3 { + font-size:1.4375em; + font-weight:bold; + margin-bottom:.30435em; + } + + h4 { + font-size:1.25em; + font-weight:bold; + margin-bottom:.25em; + } + + h5 { + font-size:1.125em; + font-weight:bold; + margin-bottom:.2222em; + } + + h6 { + font-size:1em; + font-weight:bold; + } + + img, iframe, video { + display:block; + max-width:100%; + } + + video, iframe, img { + display:block; + margin:0 auto; + } + + p, blockquote, iframe, img, ul, ol, pre, video { + margin-bottom:1em; + } + + pre { + white-space:pre; + white-space:pre-wrap; + word-wrap:break-word; + padding: 1em; + border:1px solid #888; + } + + em { + font-style:italic; + } + + li { + padding:.25em 0; + vertical-align:middle; + } +} + +.deck-before, .deck-previous, .deck-next, .deck-after { + position:absolute; + left:-999em; + top:-999em; +} + +.deck-current { + z-index:2; +} + +.slide .slide { + visibility:hidden; + position:static; + min-height:0; +} + +.deck-child-current { + position:static; + z-index:2; + + .slide { + visibility:hidden; + } + + .deck-previous, .deck-before, .deck-current { + visibility:visible; + } +} + +@media all and (orientation:portrait) { + +} + +@media all and (orientation:landscape) { + +} + +@media screen and (max-device-width: 480px) { + + /* html { -webkit-text-size-adjust:none; -ms-text-size-adjust:none; } */ +} + + +@media print { + * { + background: transparent !important; + color: black !important; + text-shadow: none !important; + filter:none !important; + -ms-filter: none !important; + -webkit-box-reflect:none !important; + -moz-box-reflect:none !important; + -webkit-box-shadow:none !important; + -moz-box-shadow:none !important; + box-shadow:none !important; + + :before, :after { + display:none !important; + } +} + a, a:visited { color: #444 !important; text-decoration: underline; } + a[href]:after { content: " (" attr(href) ")"; } + abbr[title]:after { content: " (" attr(title) ")"; } + .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } + pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } + thead { display: table-header-group; } + tr, img { page-break-inside: avoid; } + @page { margin: 0.5cm; } + p, h2, h3 { orphans: 3; widows: 3; } + h2, h3{ page-break-after: avoid; } + + .slide { + position:static !important; + visibility:visible !important; + display:block !important; + -webkit-transform:none !important; + -moz-transform:none !important; + -o-transform:none !important; + -ms-transform:none !important; + transform:none !important; + opacity:1 !important; + } + + h1, .vcenter { + -webkit-transform:none !important; + -moz-transform:none !important; + -o-transform:none !important; + -ms-transform:none !important; + transform:none !important; + padding:0 !important; + position:static !important; + } + + .deck-container > .slide { + page-break-after: always; + } + + .deck-container { + width:100% !important; + height:auto !important; + padding:0 !important; + display:block !important; + } + + script { + display:none; + } +} diff --git a/deck2png.js b/deck2png.js new file mode 100644 index 0000000..576dbe0 --- /dev/null +++ b/deck2png.js @@ -0,0 +1,58 @@ +var webpage = require('webpage'), + page = webpage.create(), + system = require('system'), + url = system.args[1] || 'index.html', + fs = require('fs'), + imageSources = [], + imageTags; + +page.onLoadFinished = function(status) { + var slideCount; + + if (status !== 'success') { + console.log('Target file not found.'); + phantom.exit(); + } + + page.viewportSize = { + width: 960, + height: 522 + }; + + slideCount = page.evaluate(function() { + var $ = window.jQuery; + + $('html').removeClass('csstransitions cssreflections'); + $('html, body').css({ + 'width': 960, + 'height': 522, + 'overflow': 'hidden' + }); + $.deck('.slide'); + return $.deck('getSlides').length; + }); + + fs.makeDirectory('temp-slides'); + + for (var i = 0; i < slideCount; i++) { + var src = 'temp-slides/output-' + i + '.png'; + imageSources.push(src); + console.log('Rendering slide #' + i); + page.render(src); + page.evaluate(function() { + var $ = window.jQuery; + $.deck('next'); + }); + } + + imageTags = imageSources.map(function(src) { + return ''; + }); + + var output = imageTags.join('') + ''; + fs.write('temp-output.html', output, 'w'); + + phantom.exit(); +}; + +page.open(url); diff --git a/extensions/goto/deck.goto.css b/extensions/goto/deck.goto.css new file mode 100644 index 0000000..108e4f9 --- /dev/null +++ b/extensions/goto/deck.goto.css @@ -0,0 +1,41 @@ +.deck-container .goto-form { + position: absolute; + z-index: 3; + bottom: 10px; + left: 50%; + height: 1.75em; + margin: 0 0 0 -9.125em; + line-height: 1.75em; + padding: 0.625em; + display: none; + background: #ccc; + overflow: hidden; +} +.borderradius .deck-container .goto-form { + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; +} +.deck-container .goto-form label { + font-weight: bold; +} +.deck-container .goto-form label, .deck-container .goto-form input { + display: inline-block; + font-family: inherit; +} + +.deck-goto .goto-form { + display: block; +} + +#goto-slide { + width: 8.375em; + margin: 0 0.625em; + height: 1.4375em; +} + +@media print { + .goto-form, #goto-slide { + display: none !important; + } +} diff --git a/extensions/goto/deck.goto.html b/extensions/goto/deck.goto.html new file mode 100644 index 0000000..e3b6a18 --- /dev/null +++ b/extensions/goto/deck.goto.html @@ -0,0 +1,7 @@ + +
+ + + + +
\ No newline at end of file diff --git a/extensions/goto/deck.goto.js b/extensions/goto/deck.goto.js new file mode 100644 index 0000000..eedba10 --- /dev/null +++ b/extensions/goto/deck.goto.js @@ -0,0 +1,170 @@ +/*! +Deck JS - deck.goto +Copyright (c) 2011 Caleb Troughton +Dual licensed under the MIT license and GPL license. +https://github.com/imakewebthings/deck.js/blob/master/MIT-license.txt +https://github.com/imakewebthings/deck.js/blob/master/GPL-license.txt +*/ + +/* +This module adds the necessary methods and key bindings to show and hide a form +for jumping to any slide number/id in the deck (and processes that form +accordingly). The form-showing state is indicated by the presence of a class on +the deck container. +*/ +(function($, deck, undefined) { + var $d = $(document); + + /* + Extends defaults/options. + + options.classes.goto + This class is added to the deck container when showing the Go To Slide + form. + + options.selectors.gotoDatalist + The element that matches this selector is the datalist element that will + be populated with options for each of the slide ids. In browsers that + support the datalist element, this provides a drop list of slide ids to + aid the user in selecting a slide. + + options.selectors.gotoForm + The element that matches this selector is the form that is submitted + when a user hits enter after typing a slide number/id in the gotoInput + element. + + options.selectors.gotoInput + The element that matches this selector is the text input field for + entering a slide number/id in the Go To Slide form. + + options.keys.goto + The numeric keycode used to show the Go To Slide form. + + options.countNested + If false, only top level slides will be counted when entering a + slide number. + */ + $.extend(true, $[deck].defaults, { + classes: { + goto: 'deck-goto' + }, + + selectors: { + gotoDatalist: '#goto-datalist', + gotoForm: '.goto-form', + gotoInput: '#goto-slide' + }, + + keys: { + goto: 71 // g + }, + + countNested: true + }); + + /* + jQuery.deck('showGoTo') + + Shows the Go To Slide form by adding the class specified by the goto class + option to the deck container. + */ + $[deck]('extend', 'showGoTo', function() { + $[deck]('getContainer').addClass($[deck]('getOptions').classes.goto); + $($[deck]('getOptions').selectors.gotoInput).focus(); + }); + + /* + jQuery.deck('hideGoTo') + + Hides the Go To Slide form by removing the class specified by the goto class + option from the deck container. + */ + $[deck]('extend', 'hideGoTo', function() { + $($[deck]('getOptions').selectors.gotoInput).blur(); + $[deck]('getContainer').removeClass($[deck]('getOptions').classes.goto); + }); + + /* + jQuery.deck('toggleGoTo') + + Toggles between showing and hiding the Go To Slide form. + */ + $[deck]('extend', 'toggleGoTo', function() { + $[deck]($[deck]('getContainer').hasClass($[deck]('getOptions').classes.goto) ? 'hideGoTo' : 'showGoTo'); + }); + + $d.bind('deck.init', function() { + var opts = $[deck]('getOptions'), + $datalist = $(opts.selectors.gotoDatalist), + slideTest = $.map([ + opts.classes.before, + opts.classes.previous, + opts.classes.current, + opts.classes.next, + opts.classes.after + ], function(el, i) { + return '.' + el; + }).join(', '), + rootCounter = 1; + + // Bind key events + $d.unbind('keydown.deckgoto').bind('keydown.deckgoto', function(e) { + var key = $[deck]('getOptions').keys.goto; + + if (e.which === key || $.inArray(e.which, key) > -1) { + e.preventDefault(); + $[deck]('toggleGoTo'); + } + }); + + /* Populate datalist and work out countNested*/ + $.each($[deck]('getSlides'), function(i, $slide) { + var id = $slide.attr('id'), + $parentSlides = $slide.parentsUntil(opts.selectors.container, slideTest); + + if (id) { + $datalist.append('