Dále tam chybí třeba rozšiřitelný pattern matching
Co si pod tím mám představit?
Můžete si definovat vlastní vzory pro pattern matching. Například pro čísla si v F# (viz
active patterns) můžete definovat vzor
let (|Even|Odd|) input = if input % 2 = 0 then Even else Odd
a pak psát (
match ... with je jako
case ... of):
match input with
| Even -> printfn "%d is even" input
| Odd -> printfn "%d is odd" input
V praxi to lze použít třeba pro
parsování. Scala má něco podobného a říká se tomu extraktory.
Parsování JSONu jsem už zkoušel (kvůli těm WS zprávám) a je to pracné. Už jsem o tom psal výš. Zas ale se to dá docela hezky parametrizovat a navíc to člověka donutí k pečlivosti (z BE prostě musím poslat správně strukturovaný JSON). Je to takové pro a proti, to je přesně ten důvod, proč nad tím dumám 
Ve Scale s knihovnou
circe stačí deklarovat case classu (záznam) a pak napsat jen
decode[Foo], kde
Foo je název deklarované case classy. Pokud není k dispozici dekodér pro
Foo, tak se pomocí implicitního makra vygeneruje automaticky.
Pokud správně tuším problém, asi na to člověk musí jít v Elmu dost "ručně" pomocí klasických "union types" (tak tomu říkají v Elmu, teď si nevybavím, jestli to má nějaký spešl název v Haskellu - prostě klasické "Result a = Err | Ok a").
Ano, to lze v OCamlu také (a říká se tomu varianty). Předpokládejme, že dále máme
Barva = Zelena | Cervena | Modra. Polymorfní varianty dovolují napsat funkci, jenž zpracovává pouze zprávy
Ok a | Zelena | Cervena (a když do ní zkusíte dát
Modra nebo
Err nebo něco jiného, tak to kompilátor označí za chybu). V OCamlu je rozdíl v syntaxi - názvy polymorfních variant začínají zpětnou uvozovkou. Další rozdíl je, že se nemusí dopředu deklarovat.
Oproti
Coproductu z shapelessu to má o dost lepší typovou inferenci, nezpomaluje to kompilátor a podporuje to i rekurzivní typy.