initial commit
This commit is contained in:
commit
d2124c1379
5 changed files with 165 additions and 0 deletions
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
*.o
|
||||||
|
*.hi
|
||||||
|
*~
|
||||||
|
Mandelbulb
|
||||||
|
hglmandel
|
||||||
|
02_Edges/HGLMandelEdge
|
68
00_Introduction.lhs
Normal file
68
00_Introduction.lhs
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
My last two post where about Haskell and how to do something useful with it.
|
||||||
|
|
||||||
|
Now, it is time to talk about Categories.
|
||||||
|
How this notion could help you and how it is easy to use with Haskell.
|
||||||
|
|
||||||
|
- What are categories?
|
||||||
|
- How to use them?
|
||||||
|
|
||||||
|
First, a realisation.
|
||||||
|
|
||||||
|
Programming paradigm. When you program, you resolve problems.
|
||||||
|
There are a lot of different means to resolve a problem.
|
||||||
|
Some general school of thought exists.
|
||||||
|
|
||||||
|
In programming, most people use the imperative paradigm.
|
||||||
|
You use some memory and update it.
|
||||||
|
More precisely, you destroy part of information by setting variables to new values.
|
||||||
|
Hidden somewhere, there is the model of the Turing machine.
|
||||||
|
Of course, it is more complex with modern architecture, but the paradigm is the same.
|
||||||
|
You have an infinite number of cell and you can write things on them.
|
||||||
|
But you must erase them.
|
||||||
|
|
||||||
|
Another paradigm, is the functional paradigm.
|
||||||
|
This time, you don't write on cells, but instead you have a flow of data.
|
||||||
|
And you transform the flows in another flows... Mostly it looks like pipes.
|
||||||
|
I am a bit restrictive here. But generally this is how functional programming is perceived.
|
||||||
|
The main theory behind this paradigm is the Set theory.
|
||||||
|
You have a set and you go from one set to another set by using a function.
|
||||||
|
|
||||||
|
But using I believe there is another paradigm arising from Category theory.
|
||||||
|
And from what I saw up until there.
|
||||||
|
Category theory is both more general and powerful to help solve problems.
|
||||||
|
|
||||||
|
First, you must realize there are categories everywhere.
|
||||||
|
With the category theory you can find relationships between quantum physics,
|
||||||
|
topology, logic (both predicate and first order), programming.
|
||||||
|
Most of the time, the object your are programming with will form a category.
|
||||||
|
|
||||||
|
This is the promise from the Category Theory.
|
||||||
|
Another even better paradigm.
|
||||||
|
A paradigm with gates between many different domains.
|
||||||
|
|
||||||
|
## Get some intuition
|
||||||
|
|
||||||
|
We write down the definition first.
|
||||||
|
And will discuss about some categories.
|
||||||
|
|
||||||
|
> **Definition**:
|
||||||
|
>
|
||||||
|
> A category \\(C\\) consist of:
|
||||||
|
>
|
||||||
|
> - A collection of _objects_ \\(ob(C)\\)
|
||||||
|
> - For every pair of objects \\((A,B)\\) a set \\(hom(A,B)\\)
|
||||||
|
> of _morphisms_ \\(f:A→B\\) (Another notation for \\(f\in hom(A,B)\\))
|
||||||
|
> - A composition operator \\(∘\\)
|
||||||
|
> which associate to each couple \\(g:A→B\\), \\(f:B→C\\) another morphism \\(f∘g:A→C\\).
|
||||||
|
>
|
||||||
|
> With the following properties
|
||||||
|
>
|
||||||
|
> - for each object \\(x\\) there is an identity morphism
|
||||||
|
> \\(id_x:x→x\\)
|
||||||
|
> s.t. for any morphism \\(f:A->B\\),
|
||||||
|
> \\(id_A∘f = f = f∘id_B\\)
|
||||||
|
> - for all triplet of morphisms \\(h:A->B\\), \\(g:B->C\\) and \\(f:C->D\\)
|
||||||
|
> \\( (f∘g)∘h = f∘(g∘h) \\)
|
||||||
|
|
21
config.ymd
Executable file
21
config.ymd
Executable file
|
@ -0,0 +1,21 @@
|
||||||
|
-----
|
||||||
|
isHidden: false
|
||||||
|
menupriority: 1
|
||||||
|
kind: article
|
||||||
|
created_at: 2012-10-01T19:16:43+02:00
|
||||||
|
en: title: Categeory Theory Programming
|
||||||
|
fr: title: Programmation en Théorie des Catégories
|
||||||
|
author_name: Yann Esposito
|
||||||
|
author_uri: yannesposito.com
|
||||||
|
tags:
|
||||||
|
- Haskell
|
||||||
|
- programming
|
||||||
|
- functional
|
||||||
|
- category theory
|
||||||
|
-----
|
||||||
|
|
||||||
|
begindiv(intro)
|
||||||
|
|
||||||
|
en: %tldr How to program using category theory.
|
||||||
|
fr: %tlal Comment programmer en utilisant la théorie des catégories.
|
||||||
|
|
32
create_ymd.sh
Executable file
32
create_ymd.sh
Executable file
|
@ -0,0 +1,32 @@
|
||||||
|
#!/usr/bin/env zsh
|
||||||
|
|
||||||
|
function writeTOC() {
|
||||||
|
|
||||||
|
cat <<END
|
||||||
|
> <center><hr style="width:30%;float:left;border-color:#CCCCD0;margin-top:1em"/><span class="sc"><b>Table of Content</b></span><hr style="width:30%;float:right;border-color:#CCCCD0;margin-top:1em"/></center>
|
||||||
|
>
|
||||||
|
> * This will be replaced by the ToC
|
||||||
|
> {:toc}
|
||||||
|
>
|
||||||
|
END
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
cat config.ymd
|
||||||
|
|
||||||
|
writeTOC
|
||||||
|
|
||||||
|
cat <<END
|
||||||
|
|
||||||
|
enddiv
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
for fic in **/*.lhs(.N); do
|
||||||
|
contains_haskell=$(( $( egrep '^>' $fic | wc -l) > 0 ))
|
||||||
|
((contains_haskell)) && \
|
||||||
|
print -- "\n<hr/><a href=\"code/$fic\" class=\"cut\">Download the source code of this section → ${fic:h}/<strong>${fic:t}</strong></a>\n"
|
||||||
|
cat $fic
|
||||||
|
((contains_haskell)) && \
|
||||||
|
print -- "\n<a href=\"code/$fic\" class=\"cut\">Download the source code of this section → ${fic:h}/<strong>${fic:t}</strong> </a>\n"
|
||||||
|
done | perl -pe 'BEGIN{$/="";} s#((^>.*\n)+)#<div class="codehighlight">\n<code class="haskell">\n$1</code>\n</div>\n#mg' | perl -pe 's#^> ?##' | perl -pe 's/^ #/#/'
|
38
prev
Executable file
38
prev
Executable file
|
@ -0,0 +1,38 @@
|
||||||
|
#!/usr/bin/env zsh
|
||||||
|
|
||||||
|
webroot="$HOME/Sites/webroot"
|
||||||
|
|
||||||
|
print -- "Search script"
|
||||||
|
while [[ ! -x ./create_ymd.sh ]]; do
|
||||||
|
[[ $PWD = "/" ]] && {
|
||||||
|
print -- "Error: can't find create_ymd.sh" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
cd ..
|
||||||
|
done
|
||||||
|
|
||||||
|
print -- "Create article"
|
||||||
|
./create_ymd.sh > $webroot/latest.ymd
|
||||||
|
|
||||||
|
print -- "Copy source codes"
|
||||||
|
ycp() {
|
||||||
|
local precedent=""
|
||||||
|
for e in $*;do
|
||||||
|
[[ $precedent != "" ]] && print -- "\t$precedent"
|
||||||
|
precedent=$e
|
||||||
|
done
|
||||||
|
cp $*
|
||||||
|
}
|
||||||
|
latestArticleDir=$(ls -l $webroot/latest.ymd | perl -pi -e 's#.*/##; s#.md$##')
|
||||||
|
for langue in en fr; do
|
||||||
|
dst="$webroot/output/Scratch/$langue/blog/$latestArticleDir/code"
|
||||||
|
[[ ! -d $dst ]] && mkdir -p $dst
|
||||||
|
ycp *.lhs(N) $dst
|
||||||
|
for dir in ??_*(N/); do
|
||||||
|
[[ ! -d $dst/$dir ]] && mkdir $dst/$dir
|
||||||
|
ycp $dir/*.{lhs,hs}(.N) $dst/$dir
|
||||||
|
done
|
||||||
|
done
|
||||||
|
print -- "\nRecompile"
|
||||||
|
cd $webroot
|
||||||
|
./tasks/recompile
|
Loading…
Reference in a new issue