Tohle bez optimalizací spadne na stack overflow, protože Haskell neudělá tail-recursive optimalizaci. Takže jinými slovy Haskell mě nutí, abych veškerý kód používal za všech okolností s O2 optimalizací, jinak není nic zaručeno.
Ne, musíš to kompilovat s -O, což je ale standardní režim kompilace pro veškeré cabal projekty. Naopak, když to chceš kompilovat bez optimalizací, musíš to kompilovat s -O0. Tys to asi kompiloval přímo s GHC, to to má možná defaultně vypnuté, ale takhle se nic nevyvíjí. Dneska se docela často na vývoj používá
stack.
To je právě ono, v imperativních jazycích žádný brutálně rekurzivní kód nenapíšeš, proč bys to dělal? Napíšeš cyklus. Ve funcionálních jazycích je rekurze naprosto typický design pattern, jinak se v tom v podstatě programovat nedá. Jenže v Haskellu to bez O2 nefunguje.
Protože spousta algoritmů je moc hezky popsána rekurzivně - tak proč to tak nepsat.
Mimochodem, v Haskellu není rekurze úplně typický design pattern. Typický design pattern je používat právě ty funkce typu "fold" - proto je u toho "foldl" všude ten velký vykřičník, protože to je typický design pattern (a typický výjimka z něho).
Což je dost hrozné, proč se to nedá používat normálně i s vypnutými optimalizacemi? Nebo jinak, proč vůbec jdou ty optimalizace vypnout, když bez nich pořádně nic nefunguje?
A proč by to nemělo jít vypnout? Když už se v tomhle hrabeš, tak se tak nějak předpokládá, že víš, co děláš. Ona mimochodem ta optimalizace se dá trošku řídit (Rewrite rules) a když v tom třeba hledáš chybu, tak jsi docela rád, že se dá s těma optimalizacema štelovat. Další věc je, že ten překladač se velmi zajímavě vyvíjí a sem tam někdo na světě narazí na něco, co se třeba nepřeložilo dobře - tak je dobré mít způsob, jak ten problém vůbec najít.
Mimochodem, Scala pokud vím tail-call optimalizaci má dost problematickou, protože JRE to neumí - a to je pak trošku větší problém.