関数の型のコンテキストでのチルダ(~)はなんだろう
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 ()
的な