はじめに

persistent ライブラリで SomeFieldCopyField に置き換える際のPRで、パターンシノニム (Pattern Synonyms) の面白い使い方を見つけました。

もしかしたら良く知られた技なのかもしれませんが、ご紹介したいと思います。

パターンシノニムが何かについての説明は、今回全くしていませんのでわかる人向けです。

モチベーション

パターンシノニムはパターンの再利用を可能にするための言語拡張です。詳しくは User’s Guide 10.7. Pattern synonyms をご確認ください。

使いみちは色々あると思いますが、今回はコンストラクタを DEPRECATED にするために利用する例をご紹介します。(実際のコードはこのあたりです)

Persistent ライブラリの 3.0.0 から SomeField が廃止され HandleUpdateCollision 型が導入されました。

SomeField 型は Persistent の中でも結構重要な型 (SomeException と同じような雰囲気の型) です。また Yesod のプロジェクトでは多数のユーザがいるため、このような変更に対しては、いきなり削除するのではなく DEPRECATED プラグマを利用して、新しい関数への移行を促しています。

今回の場合、関数ではなくデータ型を変更する必要があるためパターンシノニムが利用されています。

実際のコード

コメント等を適宜削除しましたが、実際にはこんな感じで利用されています。

重要な部分はここですね。

Haskell には型シノニムがあるのにデータシノニムって無いんですね。。。って思った人はパターンシノニムを使えばこんな感じで実現可能です。

通常、パターンシノニムを利用するモチベーションはパターンマッチの再利用にあると思うのですが、単純にデータコンストラクタのエイリアスにしておいて DEPRECATED を促すやり方も結構使えるなーと思いました。

以上です。