Concurrent Clean : レコード型がぐったりな件

やや遅れ気味ですが。
前にも書いたことがありますが、Cleanのレコード型も同じぐったりさがあります。
たとえば、

::Complex = { re :: Real, im :: Real }

だったら、他にre, imを使っているレコードを定義していなければ、

let pi = { re = 3.14, im = 0.0 }
in  pi.re

でとおりますが、他に使っているレコードがあれば、

pi.Complex.re

と書いてやらなければダメです。ambiguousだといって怒られます。
いや、そもそもレコードを作るところから、

let pi = {Complex| re = 3.14, im = 0.0 }

と書くことを要求されます。
ということで、最近では、レコードを無名で使おうという気はなくなって、フィールドに名前のついた代数データ型の一種だと割り切って、

let {Complex| re} = pi
in  re

みたいに、パターンマッチで受ける書き方しか使っていません。
それでも、レコードの方が効率的らしいという噂*1と、フィールドの追加・削除・変更に強いという理由で、特に理由がなければレコード型を使うのを習慣にしています。

*1:後で確認したら、タプルよりということらしい
http://sky.zero.ad.jp/~zaa54437/programming/clean/LanguageReport21/Chap10.html#sc9