> > show は引数の式を完全に評価するとは限りません。
> > それは、show の定義によります。
> 
>   ホントだ。show (return () >> putChar 'a') も "<<IO action>>"
> と表示されますね。となるとトップレベルの評価ループは show の
> ループではないということですか。

いいえ、所謂 read-eval-print-loop です。

Prelude> putChar 'a'

は、putChar 'a' を whnf になるまで評価してから、その結果を show します。
putChar 'a' の評価結果を show すると "" :: String ですので何も表示されません。
但し、putChar 'a' をwhnfになるまで評価すると、副作用が表われて a が表示
されます。

Prelude> show (putChar 'a')

の場合は show (putChar 'a') を whnf になるまで評価してから、その結果の値
"<<IO action>>" :: String を表示します。このとき、show (putChar 'a')
の値を得るのに putChar 'a' を whnf まで評価する必要(show の定義に依存します)
がありませんので、副作用もありません。

--nobsun







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