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
ってできないのは 0
が Integer
になるから??
こんなエラーが出る
>> 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
で利用している.
例えば