View on GitHub

test-extensible

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

Extensible のメモ (その2)

拡張可能バリアント(直和型)いろいろ

Variant

バリアントは ML 系で採用されている直和型を表現できる型のこと. Haskell にはバリアントは無いので,Haskell の言葉で言えば Extensible Variant は拡張可能な直和型っぽい

>> type Color = Variant '[ "rgb" >: (Int,Int,Int), "cmyk" >: (Int,Int,Int,Int) ]
>> color1 = embed $ #rgb @= (0 :: Int, 0 :: Int, 0 :: Int) :: Color
>> color1
EmbedAt $(mkMembership 0) (rgb @= (0,0,0))
>> color2 = embedAssoc $ #cmyk @= (0,0,0,0) :: Color
>> color2
EmbedAt $(mkMembership 1) (cmyk @= (0,0,0,0))

embed $ #rgb @= (0,0,0) :: Color ってできないのは 0Integer になるから?? こんなエラーが出る

>> color1 = embed $ #rgb @= (0,0,0) :: Color

<interactive>:29:10: error:
    ? Couldn't match type ‘'Missing
                             ("rgb" ':> (Integer, Integer, Integer))’
                     with ‘'Expecting pos0’
        arising from a use of ‘embed’
    ? In the expression: embed $ #rgb @= (0, 0, 0) :: Color
      In an equation for ‘color1’:
          color1 = embed $ #rgb @= (0, 0, 0) :: Color

拡張可能直和型でパターンマッチ

書いた

>> area shape2
6.0
>> nudge shape1 (#x @= 1 <: #y @= 2 <: nil)
EmbedAt $(mkMembership 0) (circle @= Circle (mid @= (x @= 2.0 <: y @= 4.0 <: nil) <: r @= 2.0 <: nil))

参考

バリアントについて唯一の記事(たぶん)

この記事を書いた後に,Tangle みたいに Key-Value をセットに書けば,newtype でラップする必要が無い事に気づいた. このやり方は matsubara0507/scrapbook で利用している. 例えば