Haskell, Concurrent Clean : Re: 正格性フラグを使ってseqを定義する

http://www.tom.sfc.keio.ac.jp/~sakai/d/?date=20071023#p01
http://twitter.com/jmuk/statuses/365608742
これにそれほど感銘を受ける理由がいまいち分からなくて、不思議な感じ。

:: T = T !Int

t :: !Int -> A

って大した違いはなくて、前者のほうは

T :: !Int -> T
_T :: !T -> Int

を同時に定義しているような意味なわけだから。
この変換を考えれば、

:: S = S Int

というデータ型は

S :: Int -> S
_S :: !S -> Int

というのと同じ。TとSの違いは、Intの評価のタイミングがどちらの関数の側にあるかという違いだけで、結果に変わりはない。
Cleanはデータ型にも関数宣言にも正格性フラグがあるのに対して、Haskellはデータ型にしかないというのは、対称的じゃない感じで不思議だったのだけれど。

      • -

ちなみに、正格性フラグに対してもseqと同じ疑問があって、これってGHC拡張とかになるの?