nobsun です。

>    わからないのは
>      putChar 'a'
> で a が出力されて
>      [putChar 'a']
> では [<<IO action>>]  と show されることです。
>    どうして前者は <<IO action>> と show されずにアクションが
> 実行されるのでしょうか。

Prelude> 'a'
'a'
Prelude>

この場合、'a' という式を評価した結果 a を show しています。

Prelude> putChar 'a'
a
Prelude>

この場合、a と出ているのは、副作用で出力です。 putChar 'a' を評価した
「結果の値」を show しても何も表示されません。

Prelude> show (putChar 'a')
"<<IO action>>"
Prelude>

show は引数の式を完全に評価するとは限りません。
それは、show の定義によります。

--nobsun


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