Associated Type Family
Open type synonym familyは型クラスと一緒に用いられることが多いので、
セットで書けるような記法を用意しました、的な
class内での記述
type Hoge ..
のように書く
type family Hoge ..
と書いても同じ
型パラメータは全て型変数
つまり Int
みたいな具体型を型変数には書けない
型クラスの型引数が複数ある場合はどれか一部でも使っていればok
こういうのも可能
tf26.hsclass C a b c where
type T c a x :: Type
順番異なる
a
と c
のみ使う
型クラス引数にない型変数 x
を使ってる
defaultのinstanceを指定できる
ただし一つまで。
hsclass 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 ..
を省略できる
instance内での記述
type Hoge .. = ..
のように書く
type instance .. = ..
と書いても同じ
以下の ココ
の部分が一致している必要がある
hs instance Collects ココ where
type Elem ココ = e
例
hsinstance Eq (Elem [e]) => Collects [e] where
type Elem [e] = e -- OK
type Elem [x] = x -- BAD [x]じゃなく[e]にしないといけない
type Elem x = x -- BAD 明らかに違う
複数書いてもいい
tf30.hsinstance GMapKey Flob where
data GMap Flob [v] = G1 v
data GMap Flob Int = G2 Int
...
Associated Type Familyを使って定義されている型クラスの例
class宣言だけ見るとよくわからないが、
instance宣言も複数並べて書いてみると、
良い例があればここに書く

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