nobsun です.

> 結局の所Haskellでは,stdioやファイルなどIOに絡まない計算は
> 評価されないのでしょうか.
> それ以外はseqを使った場合だけ,強制的に正格評価をするという事ですか?

IO や seq が絡む絡まないは関係なく,評価する「必要」のないものは評価しない
ということになります.単純にするために,

main     = loop 0
loop n   = loop (update n)
update n = n

という例を考えてみましょう.update は結局何もしない関数なのですが,
main の評価家庭を見ると

main → loop 0                                    main の定義
     → loop (update 0)                           loop の定義
     → loop (update (update 0))                  loop の定義
     → loop (update (update (update 0)))         loop の定義
     → ...

のように評価が進み,Heapが溢れるということです.この定義では,loop 
は引数 n の「値」が何であるか評価する必要がありません.したがって,
update 0 は評価されません.

loop x が x の値を必要としないことは,loop (error "HogeHoge") とやって
も HogeHoge のエラー出力はでないで,Heap を食いつくします.

loop の定義を値を必要とするパターンマッチを行うように

loop 0 = loop (update 0)
loop n = loop (update n)

に換えると今度は,

main → loop 0
        loop 0                          パターンマッチのために 0 を評価
        loop (update 0)                 引数 0 に対する定義を適用
        loop 0                          パターンマッチのために update 0 を評価
        loop (update 0)                 引数 0 に対する定義を適用
	...
        ...

のように評価がすすみ,評価は終了しませんが使用するメモリは増えないので
いつまでもプログラムが走ります.

--nobsun

--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/