最近、 #Haskell でコードを書いていて、代数的データ型の型シノニムに付随してデータ構築子をエキスポート/インポートしたいと思うことがあった。 例えば、以下のようにデータ構築子CをM2からT経由でインポートして使いたい。

------------------------
module M1 (T (..), ...) where
type T = D Int
data D a = C ...
------------------------
module M2 where
import M1 (T (..))
foo = ... C ...
------------------------

どういう時に欲しくなるかというと、元々はTが代数的データ型だったんだけれど、設計を一般化して、より一般化された別の代数的データ型Dのシノニムにした場合。そうというときに、利用者側のモジュールは出来るだけ変更なしでそのまま使えるように互換性を出来るだけ保っておきたい。(まあ、型シノニムと代数的データ型の違いが出てしまう部分は他にもあるので、これだけで互換性を維持出来るわけではないけれど)