View on GitHub

test-extensible

Haskell の extensible パッケージのテストリポジトリ

Extensible のメモ (その5)

拡縮いろいろ

拡張可能レコードやバリアントは,その名の通り拡縮を行える.

Inclution

xs ⊆ ys定義されてまして,おそらく「ysxs が持つフィールドをすべて持ってる」って感じの意味だと思う. その型クラスに関する関数に shrinkspread がありまして,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

すごい(笑)

参考

こっちのが詳しい??