Fixes about Haskell Introduction Presentation
This commit is contained in:
parent
21f4bf88ba
commit
2e41a6a6c6
1 changed files with 77 additions and 29 deletions
|
@ -8,7 +8,9 @@
|
|||
Initialiser l'env de dev:
|
||||
|
||||
#+BEGIN_SRC shell
|
||||
curl -sSL https://get.haskellstack.org/ | sh
|
||||
stack new ipfh https://git.io/vbpej && \
|
||||
cd ipfh && \
|
||||
stack setup && \
|
||||
stack build && \
|
||||
stack test && \
|
||||
|
@ -91,6 +93,8 @@ stack bench
|
|||
+--------------------------------+
|
||||
#+END_SRC
|
||||
|
||||
made with http://asciiflow.com
|
||||
|
||||
*** Von Neumann vs Church
|
||||
|
||||
- programmer à partir de la machine (Von Neumann)
|
||||
|
@ -436,7 +440,7 @@ foo = sum results
|
|||
|
||||
. . .
|
||||
|
||||
*~fmap~ FTW!!!!! Assurance d'avoir le même résultat avec 32 cœurs*
|
||||
*~pmap~ FTW!!!!! Assurance d'avoir le même résultat avec 32 cœurs*
|
||||
|
||||
#+BEGIN_SRC haskell
|
||||
import Foreign.Lib (f)
|
||||
|
@ -444,7 +448,7 @@ import Foreign.Lib (f)
|
|||
-- f = ???
|
||||
|
||||
foo = sum results
|
||||
where results = fmap f [1..100]
|
||||
where results = pmap f [1..100]
|
||||
#+END_SRC
|
||||
|
||||
*** /Pureté/: Structures de données immuable
|
||||
|
@ -553,16 +557,21 @@ Composabilité: soit deux ~a~ je peux faire un autre ~a~.
|
|||
ex: x un widget, y un widget => un widget
|
||||
~let page = x <+> y~
|
||||
|
||||
Gain abstraction, moindre coût.
|
||||
Gain d'abstraction, moindre coût.
|
||||
|
||||
*Hypothèses fortes sur les ~a~*
|
||||
|
||||
*** Exemples
|
||||
|
||||
- *Semi-groupes* (+)
|
||||
- *Monoides* (0,+)
|
||||
- Foncteurs
|
||||
- Foncteurs Applicatifs
|
||||
- Monades
|
||||
- Traversables (map)
|
||||
- Foldables (reduce)
|
||||
- *Semi-groupes* 〈+〉
|
||||
- *Monoides* 〈0,+〉
|
||||
|
||||
- *Catégories* 〈obj(C),hom(C),∘〉
|
||||
- Foncteurs ~fmap~ (~(<$>)~)
|
||||
- Foncteurs Applicatifs ~ap~ (~(<*>)~)
|
||||
- Monades ~join~
|
||||
- Traversables ~map~
|
||||
- Foldables ~reduce~
|
||||
|
||||
* Catégories de bugs évités avec Haskell
|
||||
|
||||
|
@ -669,24 +678,23 @@ foo :: GlobalState -> x
|
|||
*~foo~ ne peut pas changer =GlobalState=*
|
||||
|
||||
* Organisation du Code
|
||||
|
||||
*** Grands Concepts
|
||||
|
||||
Procedure vs Functions:
|
||||
|
||||
- Gestion d'une configuration globale
|
||||
- Gestion d'un état global
|
||||
- Gestion des Erreurs
|
||||
- Gestion des IO
|
||||
| Gestion d'une configuration globale |
|
||||
| Gestion d'un état global |
|
||||
| Gestion des Erreurs |
|
||||
| Gestion des IO |
|
||||
|
||||
*** Monades
|
||||
|
||||
Pour chacun de ces /problèmes/ il existe une monade:
|
||||
|
||||
- Gestion d'une configuration globale ⇒ ~Reader~
|
||||
- Gestion d'un état global ⇒ ~State~
|
||||
- Gestion des Erreurs ⇒ ~Either~
|
||||
- Gestion des IO ⇒ ~IO~
|
||||
| Gestion d'une configuration globale | ~Reader~ |
|
||||
| Gestion d'un état global | ~State~ |
|
||||
| Gestion des Erreurs | ~Either~ |
|
||||
| Gestion des IO | ~IO~ |
|
||||
|
||||
*** Effets
|
||||
|
||||
|
@ -742,20 +750,45 @@ bot manager rotLog pubsub redbots minSeverity = do
|
|||
& flip runLoggingT (renderLog minSeverity rotLog)
|
||||
#+END_SRC
|
||||
|
||||
*** Organisation plus pragmatique
|
||||
|
||||
- Reader IO
|
||||
- Insérer l'état dans une ~TVar~, ~MVar~ ou ~IORef~ (meilleur que State pur en
|
||||
pratique pour la gestion de la concurrence avec IO).
|
||||
** Règles *pragmatiques*
|
||||
|
||||
*** Organisation en fonction de la complexité
|
||||
|
||||
#+BEGIN_QUOTE
|
||||
Make it work, make it right, make it fast
|
||||
#+END_QUOTE
|
||||
|
||||
- Simple: directement IO (YOLO!)
|
||||
- Medium: Haskell Design Patterns: The Handle Pattern:
|
||||
https://jaspervdj.be/posts/2018-03-08-handle-pattern.html
|
||||
- Medium (bis): MTL / Free / Freeer / Effects...
|
||||
- Gros: Three Layer Haskell Cake:
|
||||
http://www.parsonsmatt.org/2018/03/22/three_layer_haskell_cake.html
|
||||
+ Layer 1: Imperatif
|
||||
+ Orienté Objet (Level 2 / 2')
|
||||
+ Fonctionnel
|
||||
|
||||
*** 3 couches
|
||||
|
||||
- *Imperatif*:
|
||||
ReaderT IO
|
||||
+ Insérer l'état dans une ~TVar~, ~MVar~ ou ~IORef~ (concurrence)
|
||||
- *Orienté Objet*:
|
||||
+ Handle / MTL / Free...
|
||||
+ donner des access ~UserDB~, ~AccessTime~, ~APIHTTP~...
|
||||
- *Fonctionnel*: Business Logic ~f : Handlers -> Inputs -> Command~
|
||||
|
||||
*** Services / Lib
|
||||
|
||||
Service: ~init~ / ~start~ / ~close~ + methodes...
|
||||
Lib: methodes sans état interne.
|
||||
|
||||
* Conclusion
|
||||
|
||||
|
||||
|
||||
*** Pourquoi s'investir dans Haskell
|
||||
*** Pourquoi Haskell?
|
||||
|
||||
- avantage compétitif: qualité x productivité hors norme
|
||||
- changera certainement votre approche de la programmation
|
||||
- changera son approche de la programmation
|
||||
- les concepts appris sont utilisables dans tous les languages
|
||||
- permet d'aller là où aucun autre langage ne peut vous amener
|
||||
- Approfondissement sans fin:
|
||||
|
@ -764,7 +797,22 @@ bot manager rotLog pubsub redbots minSeverity = do
|
|||
- Qualité: tests, preuves
|
||||
- Organisation: capacité de contraindre de très haut vers très bas
|
||||
|
||||
*** Contrôle par le type
|
||||
*** Avantage compétitif
|
||||
|
||||
- France, Europe du sud & Functional Programming
|
||||
- Maintenance >> production d'un nouveau produit
|
||||
- Coût de la refactorisation
|
||||
- "Make it work, Make it right, Make it fast" moins cher.
|
||||
|
||||
*** Pour la suite
|
||||
|
||||
A chacun de choisir, livres, tutoriels, videos, chat, etc...
|
||||
|
||||
- Voici une liste de resources : https://www.haskell.org/documentation
|
||||
- Mon tuto rapide : [[http://yannesposito.com/Scratch/en/blog/Haskell-the-Hard-Way/][Haskell the Hard Way]]
|
||||
- Moteurs de recherche par type : [[http://hayoo.fh-wedel.de][hayoo]] & [[http://haskell.org/hoogle][hoogle]]
|
||||
- Communauté & News : http://haskell.org/news & ~#haskell-fr~ sur freenode
|
||||
- Libs: https://hackage.haskell.org & https://stackage.org
|
||||
|
||||
|
||||
* Appendix
|
||||
|
|
Loading…
Reference in a new issue