From 5fa15ff8b7c539804499ad5dac6e3cd657e95fd7 Mon Sep 17 00:00:00 2001 From: "Mahler, Thomas" Date: Tue, 14 Apr 2020 16:31:36 +0200 Subject: [PATCH] start polishing --- README.md | 64 +++++++++++------------------------------------- img/maybe.png | Bin 0 -> 30099 bytes zettelkasten.md | 36 +++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 50 deletions(-) create mode 100644 img/maybe.png create mode 100644 zettelkasten.md diff --git a/README.md b/README.md index f4762d9..c4b6c2a 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,10 @@ ## Abstract -In this article I'm presenting some of the most important and distinguishing features of the Haskell -programming language. +In this article I try to explain why Haskell keeps being such an important language by presenting some +of its most important and distinguishing features and detailing them with working code examples. + +The presentation aims to be self-contained and does not require any previous knowledge of the language. The target audience are developers with a background in non-functional languages who are eager to learn about concepts of functional programming and Haskell in particular. @@ -1458,11 +1460,15 @@ Nothing Nothing ``` -In each single step we have to check for the `Nothing` case and only may proceed to the next step in the -`Just` case. -This kind of handling is repetitive and buries the actual intention under a lot of boilerplate code. +The resulting control flow is depicted in the following diagram: +![The Maybe railroad](img/maybe.png) + +In each single step we have to check for `Nothing`, in that case we directly short circuit to an overall `Nothing` result value. +In the `Just` case we proceed to the next processing step. + +This kind of handling is repetitive and buries the actual intention under a lot of boilerplate. As Haskell uses layout (i.e. indentation) instead of curly brackets to separate blocks the code will -end up in what is called the *dreaded staircase*. +end up in what is called the *dreaded staircase*: it maches to the right of the screen. So we are looking for a way to improve the code by abstracting away the chaining of functions that return `Maybe` values and providing a way to *short circuit* the `Nothing` cases. @@ -1478,6 +1484,7 @@ andThen :: Maybe a -> (a -> Maybe b) -> Maybe b andThen Nothing _fun = Nothing andThen (Just x) fun = fun x ``` + We can then rewrite `findDivRoot` as follows: ```haskell @@ -1618,47 +1625,4 @@ organizing your code according to the [ports and adapters pattern](https://githu ## Conclusion ---- ---- - -This is my zettelkasten (don't look at it) - - -type classes -- complex interfaces -- interpreter style - - -- Static and Strong typing (Es gibt kein Casting) -- Type Inferenz. Der Compiler kann die Typ-Signaturen von Funktionen selbst ermitteln. (Eine explizite Signatur ist aber möglich und oft auch sehr hilfreich für Doku und um Klarheit über Code zu gewinnen.) - -- Eleganz: Viele Algorithmen lassen sich sehr kompakt und nah an der Problemdomäne formulieren. - -- Weniger Bugs durch - - - Purity, keine Seiteneffekte - - - Starke typisierung. Keine NPEs ! - - - Hohe Abstraktion, Programme lassen sich oft wie eine deklarative Spezifikation des Algorithmus lesen - - - sehr gute Testbarkeit durch "Composability" - - - TDD / DDD - - - Memory Management (sehr schneller GC) - - - Modulare Programme. Es gibt ein sehr einfaches aber effektive Modul System und eine grosse Vielzahl kuratierter Bibliotheken. - - ("Ich habe in 5 Jahre Haskell noch nicht ein einziges Mal debuggen müssen") - -- Performance: keine VM, sondern sehr optimierter Maschinencode. Mit ein wenig Feinschliff lassen sich oft Geschwindigkeiten wie bei handoptimiertem C-Code erreichen. - - -## toc for code chapters (still in german) - -- static typing - -- Testbarkeit - - TDD, higher order functions assembly, Typklassen dispatch (https://jproyo.github.io/posts/2019-03-17-tagless-final-haskell.html) - \ No newline at end of file +tbd. \ No newline at end of file diff --git a/img/maybe.png b/img/maybe.png new file mode 100644 index 0000000000000000000000000000000000000000..ac0d60c7f145a74fd8c43c43ee5bccfe4e7d883f GIT binary patch literal 30099 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 G!T$nr1ioSb literal 0 HcmV?d00001 diff --git a/zettelkasten.md b/zettelkasten.md new file mode 100644 index 0000000..d52315e --- /dev/null +++ b/zettelkasten.md @@ -0,0 +1,36 @@ +This is my zettelkasten (don't look at it) + + +type classes +- complex interfaces +- interpreter style + + +- Static and Strong typing (Es gibt kein Casting, sealed traits) +- Type Inferenz. Der Compiler kann die Typ-Signaturen von Funktionen selbst ermitteln. (Eine explizite Signatur ist aber möglich und oft auch sehr hilfreich für Doku und um Klarheit über Code zu gewinnen.) + +- Eleganz: Viele Algorithmen lassen sich sehr kompakt und nah an der Problemdomäne formulieren. + +- Weniger Bugs durch + + - Purity, keine Seiteneffekte + + - Starke typisierung. Keine NPEs ! + + - Hohe Abstraktion, Programme lassen sich oft wie eine deklarative Spezifikation des Algorithmus lesen + + - sehr gute Testbarkeit durch "Composability" + + - TDD / DDD + - higher order functions assembly + - Typklassen dispatch (https://jproyo.github.io/posts/2019-03-17-tagless-final-haskell.html) + + - Memory Management (sehr schneller GC) + + - Modulare Programme. Es gibt ein sehr einfaches aber effektive Modul System und eine grosse Vielzahl kuratierter Bibliotheken. + + ("Ich habe in 5 Jahre Haskell noch nicht ein einziges Mal debuggen müssen") + +- Performance: keine VM, sondern sehr optimierter Maschinencode. Mit ein wenig Feinschliff lassen sich oft Geschwindigkeiten wie bei handoptimiertem C-Code erreichen. + + \ No newline at end of file