A dátum pure. A rendszeridő már nem. Természetesen a random, és IO sem.
Nem nettó baromság, csak sokaknak túl nehéz megérteni. Konyhanyelven arról van szó, hogy - ahogy te is írtad - a gyakorlati haszna nem sok egy kizárólag pure nyelvnek, mivel a felhasználója soha nem fog tudni értesülni a végrehajtás eredményéről. A kizárólag pure nyelvet tehát tekintheted teoretikusnak, kutatási területnek, csak épp nettó baromságnak nem.
Nyilván valahogy be kell hozni a való világba ezeket az eredményeket, erre tökéletes lehetőséget biztosít egy ún. computational context, amit a Haskell esetén épp a kategóriaelméletből kölcsönvett monádnak neveznek; ki nem találnánk melyik monád kell az IO-műveletekhez: az IO Monad.
Tévedsz azonban, mert a kizárólag pure szemlélet továbbra sem képtelenség a gyakorlati problémáknál. Egy jól szervezett programkódban elkülönítheted a pure, mellékhatásoktól mentes kódot - ami ugyanarra a bementere mindig ugyanazt a kimenetet fogja produkálni, és az eredmény _csak_ a bemenetektől függ - az IO kódtól. Gondolom a tesztelés fontosságát egy komplex szoftverben nem kell kiemelnem. Képzeld csak el, ha van a pure kódjaidra teszt x%-os coverage-dzsel, akkor az tényleg x%, és nem szólhat közben ja egy random(), ja egy readLine(), ja egy egyéb. (Zárójelben megjegyezném, hogy a (code line) coverage egy szoftver tesztelésekor kimondottan félrevezető, mert nem az állapottér lehetséges összetételét vizsgálja, hanem a fájl sorait. Improvementért lásd QuickCheck és tsai).
Szerencsém van a haskell-atyaúristen Simon Meier mellett dolgozni, tőle tanultam egy jó tippet szoftverkarbantarthatóságról. A függvényeid legkisebb része legyen impure, a többi pure, és minél több pedig total (azaz az értelmezési tartomány minden eleméhez rendel kimenetet; ez utóbbit egyszerű - a compiler általában kényszerít rá - megvalósítani).
Remélem sikerült árnyalnom a pure szemléletről alkotott véleményed.