seq 还不够给力, 它仅仅把要evaluation 的内容重写成HNF(head normal form).这种结构并不是彻底的evaluation. 它只处理第一个构造器, 对于List这种迭代构造器的形式, 相当于仅仅得到了第一项.
deepseq强制得到NF(Normal Form). 这表示完全的evaluation, 完全消除了lazyness.
典型用途:
main = do
h <- openFile "f" ReadMode
s <- hGetContents h
s `deepseq` hClose h
return s
用seq的时候return的字符串只有一截, 也就是第一段缓冲区中的头部数据.
如果连seq都没有, 那么得到的就是空字符串.
在ghci中输入的表达式最终都要被转化成NH.
这也体现了IO不纯净的特点.
注意, 有exception并不说明就不干净. 但是IO一定是不干净的.
阅读(1005) | 评论(0) | 转发(0) |