Extensible のメモ (その5)
拡縮いろいろ
拡張可能レコードやバリアントは,その名の通り拡縮を行える.
Inclution
xs ⊆ ys
が定義されてまして,おそらく「ys
は xs
が持つフィールドをすべて持ってる」って感じの意味だと思う.
その型クラスに関する関数に shrink
と spread
がありまして,shrink
は直積型を,spread
は直和型をまさに拡張可能に変換してくれる(笑)
>> :set -XOverloadedLabels -XOverloadedStrings -XDataKinds -XTypeOperators
>> :m Data.Extensible Data.Text
>> type A = Record '[ "name" >: Text, "age" >: Int ]
>> type B = Record '[ "name" >: Text, "age" >: Int, "isHuman" >: Bool ]
>> person1 = #name @= "Alise" <: #age @= 18 <: emptyRecord :: A
>> person2 = #name @= "Alise" <: #age @= 18 <: #isHuman @= True <: emptyRecord :: B
>> person1' = shrink $ person2 :: A
>> person1
name @= "Alise" <: age @= 18 <: nil
>> person2' = shrink $ #isHuman @= True <: person1 :: B
>> person2'
name @= "Alise" <: age @= 18 <: isHuman @= True <: nil
Color
型は Variant のときのを使ってる
>> type RGB = Variant '[ "rgb" >: (Int,Int,Int) ]
>> type CMYK = Variant '[ "cmyk" >: (Int,Int,Int,Int) ]
>> color3 = embed $ #rgb @= (0 :: Int, 0 :: Int, 0 :: Int) :: RGB
>> color4 = embedAssoc $ #cmyk @= (0,0,0,0) :: CMYK
>> color1' = spread color3 :: Color
>> color2' = spread color4 :: Color
すごい(笑)
参考
こっちのが詳しい??