TypeFamilyDependenciesの実用的な例を考える
Keywords:
FunctionalDependenciesというGHC言語拡張がある.Haskell Wikiによると,
Functional dependencies are used to constrain the parameters of type classes.
と書かれているが,これはどういうことか.
Haskell Language Reportで定められた範囲では,型クラスに与えられるパラメータは1つに限られるが,MultiParamTypeClassesを用いると,複数のパラメータを与えることができる.この際に,パラメータとして与えられた(複数の)型の間の関係性に制限を加えることができるのが,FunctionalDependenciesなのであった.恐らく多くの人が初めて目にするのは,mtl packageのMonadReaderの定義なのではないだろうか.| m -> rというのがそれである.
class Monad m => MonadReader r m | m -> r where
...
さて,GHC 8からTypeFamilyDependenciesというGHC言語拡張が追加された.これについては既にlotz先生が『型族が単射だと嬉しい理由』という記事を書いていらっしゃるのだが,(氏には失礼ながら)少しばかりわざとらしい例だと感じたので,もう少し実務的な例を引き合いに出して,有用性を示したいと思う.