kgdnet97



kgdnet97

0 0


kgdnet97

[KGD.NET 97] Welcome to Monad Club

On Github orient-man / kgdnet97

Welcome to Monad Club

Marcin Malinowski

Abstrakt

Pierwsza zasada klubu - monad się nie tłumaczy.

Druga zasada...

Zatem zamiast tłumaczyć, będziemy obserwować je w naturze (językach C# i F#).

O mnie

  • Tata^2, mąż humanistki, mól książkowy, uparciuch, programista, konferencjoholik. Don Kichot walczący z entropią. Kocha sprzeczności i humor. Wierzy w przypadek. Piwny filozof. W nielicznych wolnych chwilach harata w gałę (na bramce).

  • Basic, Turbo Pascal/C, Assembler, Clipper, MS Access, Visual Basic, Java-XML :), C++, C#, JavaScript, F#... i ze wszystkiego miałem frajdę, ale nie za wszystkim tęsknię.

  • Absolwent informatyki i matematyki na UW. Ekspert IT w mBanku.

Spis rzeczy

Dlaczego nie? Kod, kod, kod Dlaczego tak?

Dlaczego nie?

Bo straszno?

"Monady to byty duchowe nie mające charakteru czasowego ani przestrzennego"

Gottfried Wilhelm Leibniz

- zapytajmy eksperta

I śmieszno?

Monadic awareness is awakened through specific meditation practices.

Zródło: http://www.energyreality.com/pgs/mona.htm

Tako rzecze źródło wszelkiej wiedzy

"Monada jest rodzajem konstruktora abstrakcyjnego typu danych [...] Monady pozwalają programiście sprzęgać ze sobą kolejno wykonywane działania i budować potoki danych, w których każda akcja jest materializacją wzorca dekoratora z dodatkowymi regułami przetwarzającymi.

Formalnie monadę tworzy się definiując dwie operacje – wiązanie (ang. bind) i powrót (ang. return) [...]"

http://pl.wikipedia.org/wiki/Monada_%28programowanie%29

Kod, kod, kod...

- option - OptionBuilder - ROP - task - AsyncBuilder

async jest instancją klasy AsyncBuilder:

type AsyncBuilder =
    class
        new AsyncBuilder : unit -> AsyncBuilder
        member this.Bind : Async<'T> * ('T -> Async<'U>) -> Async<'U>
        member this.Combine : Async<unit> * Async<'T> -> Async<'T>
        member this.Delay : (unit -> Async<'T>) -> Async<'T>
        member this.For : seq<'T> * ('T -> Async<unit>) -> Async<unit>
        member this.Return : 'T -> Async<'T>
        member this.ReturnFrom : Async<'T> -> Async<'T>
        member this.TryFinally : Async<'T> * (unit -> unit) -> Async<'T>
        member this.TryWith : Async<'T> * (exn -> Async<'T>) -> Async<'T>
        member this.Using : 'T * ('T -> Async<'U>) -> Async<'U>
        member this.While : (unit -> bool) * Async<unit> -> Async<unit>
        member this.Zero : unit -> Async<unit>
    end

Na szczęście, aby używać LINQ-a nie musimy znać w każdym szczególe implementacji LINQ Providera - to samo dotyczy async i innych workflowów w F#.

Przykłady typów monadycznych w C#

  • Nullable<T>
  • Func<T>
  • Lazy<T>
  • Task<T>
  • IEnumerable<T>

Podsumownie Monad w C#

  • LINQ jest zaprojektowany do zapytań (zaskoczenie :)
    • Brak instrukcji sterujących: if/then/else, pętli etc.
  • Brak uniwersalnego wsparcia dla typu "monadycznego" na poziomie języka np.: notacja do w Haskellu, computational expressions w F#
  • Stąd część użytecznych monad zostala wbudowana w język

...ale to nie znaczy, że nie możemy stworzyć naprawdę użytecznych monad w C#!

Przykład: Parser monadyczny

Morał: Najpierw konkret potem abstrakcja

Programmable semicolons:5 AOP:3 Burritos:1 Container Types:1 Elephant in the room:3 Higher order functions:2 Chain operations:3 Pipelines:2 Decorators:3 Assembly lines:1 DSL:2 Functors:1 Amplified types:1 Wrappers around function invocation:1 Function generators:4 Programming structure that represents computations:1 Composable computation descriptions:1 https://www.jasondavies.com/wordcloud/

Bibliografia

Aaa... pytania?

Ankieta: https://www.surveymonkey.com/r/G2FW295 Pls!

http://goqr.me/
Welcome to Monad Club Marcin Malinowski Twitter: @orientman GitHub: https://github.com/orient-man Blog: https://orientman.wordpress.com/