jak se to liší od let + unsafePerformIO?
Neliší. Je to stejná prasárna. Znamená to "netuším, kdy se tyhle efekty provedou a je mi to jedno". I s unsafePerformIO (nebo unsafeInterleaveIO) se člověk musí snažit, aby ten coerce napsal, o to nejde. Jde o to, že člověk neví, kdy se efekty provedou. V Haskellu existuje věc jménem "getContent" pro čtení ze souboru, která je lazy. V produkčních programech by se neměla ani náhodou objevit, protože přestože vypadá "referenčně transparentní", tak v momentě, kdy si ten "file handle" zavřete, tak najednou přestane být.
Výsledkem pak je, že pokud se někde v tomhle "lazy" kódu stane výjimka, tak je člověk pak překvapený, kde mu ta výjimka vyskakuje....
Například ve Scale to jde snadno zařídit, aby se x a y nepočítaly, pokud nejsou použity:
lazy val x = necoSloziteho(a1, a2, a3)
lazy val y = necoSloziteho2(x, a4, a5, a6) // závisí na x
neco match {
case A => // použije se y
case B => // nepoužije se x ani y
case C => // použije se x (y nehceme počítat)
case D => // použije se y
}
Tohle ale není problém:
x <- necoSloziteho a1 a2 a3
let ry = necoSloziteho2 x a4 a5 a6 -- závisí na x
case neco of
A -> do
y <- ry-- použije se y
..
B -> -- nepoužije se x ani y
C -> -- použije se x (y nehceme počítat)
D -> do
y <- ry -- použije se y
...
Tak vlastně kýženého efektu dosáhnu a je zcela jasné, KDE se y s vedlejšími efekty použilo. Pokud chci přesně vědět a specifikovat, kde to y použiju, tak to asi jinak nejde - a mě se to moc líbí
