Ano, přesně. Seq není pure funkce, pokud je první parametr bottom. Souhlas? Pokud ne, proč?
Já ti řeknu proč. Zase se snažíš aplikovat teoretické poučky, které jsi slyšel ve škole, ale děláš to úplně blbě.
Tak zaprvé, seq v Haskellu implementovat nejde. Proto nemá smysl o seq uvažovat jako o Haskellovské funkci, ten tvůj formální popis je k ničemu. seq je nějaký "magic", který je zadrátovaný v překladačí, v podstatě je to implementation dependent, GHC to dělá nějak, jiný překladač to může dělat jinak. Použitím seq se dostáváš do vážných problémů:
https://stackoverflow.com/questions/12687392/why-is-seq-badThe seq function is not lambda definable (i.r., cannot be defined in the lambda-calculus), which means that that all the results from lambda calculus can no longer be trusted when we have seq.
Zadruhé, ty řešíš seq, ale to vůbec nemáš dělat, máš řešit bang patterns, protože -XStrict je implementované pomocí bang patterns. Ano, bang patterns můžou interně používat seq, ale to je implementační detail, klidně to může být udělané i úplně jinak. Kdyby sis přečetl specifikaci bang patterns, tak bys narazil na jednu důležitou větu, která rozbíjí všechny tvoje teorie, chování pro bottom je jasně definované:
https://downloads.haskell.org/~ghc/7.8.4/docs/html/users_guide/bang-patterns.htmlThe key change is the addition of a new rule to the semantics of pattern matching in the Haskell 98 report. Add new bullet 10, saying: Matching the pattern !pat against a value v behaves as follows: if v is bottom, the match diverges otherwise, pat is matched against v.
Jak vidíš, strict vyhodnocení v Haskellu není pro normální lidi. Normální člověk nedokáže domyslet důsledky, nepodařilo se to ani tobě. V podstatě by na každé instalačce Haskellu mělo být varování:
"POZOR! NEBEZPEČNÉ! UCHOVÁVEJTE MIMO DOSAH BĚŽNÝCH PROGRAMÁTORŮ. NEPOUŽÍVEJTE STRIKTNĚ. NEOPATRNÉ POUŽITÍ MŮŽE PORUŠIT PRAVIDLA LAMBDA KALKULU. V PŘÍPADĚ POTÍŽÍ VYHLEDEJTE NEJBLIŽŠÍHO TEORETICKÉHO MATEMATIKA."
Tím by se myslím vyřešila spousta problémů.