Concurrent Clean : 正格性について
一意性と正格性
一意性と正格性は、非常に混乱を招きやすいのですが、2つは全くの別物です。
一意性は、計算の順序を保証しているだけであって、遅延されるかどうかには影響を与えません。標準関数には、正格性注釈をつけているので、そのことに気づきにくいですが。
正格性というのは、関数に引数を渡すときや、データ型にデータを格納するときに、その関数を評価した後の値で渡すかどうかということを示していて、データのメモリ上の取り扱いに関連していて、計算の順序には関係していません。
・・・、書いていても、上手く説明できない感じなのですが、とにかく、別物だということなんですよ。
正格性について詳しく
http://sky.zero.ad.jp/~zaa54437/programming/clean/LanguageReport21/Chap10.html#sc1
#! a = f x y
これは正格let-before式ですが、この場合、aは正格評価後の値が入る変数として取り扱われます。しかし、この式自体は、aが関数内で使われない場合には、式全体が評価されません。
#! (a,b) = f x y
この場合には、式が評価されると、タプルを作るところまでは正格評価されますが、そのなかのa,bが正格評価されるかどうかは保証されていません。
| a < f y z
ガード内の式は、正格評価されるようです。
case f x y of a -> g a b -> h b
パターンマッチ全体は、正格評価ではありませんが、パターンマッチに必要なところまでの評価は、正格に行われます。
case f x y of 0 -> g 0 b -> h b
このケースでは、0と比較するので、Int型になるところまで評価されたあとで、パターンマッチが行われます。