generated at
Associated Type Family
TypeFamiliesでのSynonym Familyの定義方法の一つ
Open Type Synonym Familyの特殊版と捉えるのが良い
Open type synonym familyは型クラスと一緒に用いられることが多いので、
セットで書けるような記法を用意しました、的な



class内での記述
type Hoge .. のように書く
type family Hoge .. と書いても同じ
型パラメータは全て型変数
つまり Int みたいな具体型を型変数には書けない
型クラスの型引数が複数ある場合はどれか一部でも使っていればok
こういうのも可能
tf26.hs
class C a b c where type T c a x :: Type
順番異なる
a c のみ使う
型クラス引数にない型変数 x を使ってる
defaultのinstanceを指定できる
ただし一つまで。
hs
class IsBoolMap v where type Key v type instance Key v = Int -- default lookupKey :: Key v -> v -> Maybe Bool instance IsBoolMap [(Int, Bool)] where -- 省略可 lookupKey = lookup
その場合、instance宣言時に type Hoge .. を省略できる
これはAssociated Data Type Familyではできない

instance内での記述
type Hoge .. = .. のように書く
type instance .. = .. と書いても同じ
以下の ココ の部分が一致している必要がある
hs
instance Collects ココ where type Elem ココ = e
hs
instance Eq (Elem [e]) => Collects [e] where type Elem [e] = e -- OK type Elem [x] = x -- BAD [x]じゃなく[e]にしないといけない type Elem x = x -- BAD 明らかに違う
複数書いてもいい
tf30.hs
instance GMapKey Flob where data GMap Flob [v] = G1 v data GMap Flob Int = G2 Int ...



Associated Type Familyを使って定義されている型クラスの例


class宣言だけ見るとよくわからないが、
instance宣言も複数並べて書いてみると、
良い例があればここに書くmrsekut


Accocieatedというのはどういう意味 ?
何に関連付けられた型族?
「型クラスに」「関連付けられた」「型族」という意味か?