Equality constraints (GHC拡張)

関数の型のコンテキストでのチルダ(~)はなんだろう

GHC拡張のEquality constraintsで、
t1 ~ t2 型t1とt2が等しいというのを示す。

いつ使うのだろう

Type Familiesを使っている時に必要なる。
associated typeを使ったクラスのあるインスタンスが前提だが、そのモジュールは参照したくないモジュールで利用。

-- module A
class A  
  type Foo a

-- module B
import A  
import C  
instance A Hello  
  type Foo Hello = MyContext

-- module C
import A  
f :: (Foo a ~ MyContext, ...) => m a ()  

的な