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í 
