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 先生が『型族が単射だと嬉しい理由』という記事を書いていらっしゃるのだが,(氏には失礼ながら) 少しばかりわざとらしい例だと感じたので,もう少し実務的な例を引き合いに出して,有用性を示したいと思う.