Haskellのtypeの中身はkind!で!(型レベルハンバーガーの型やいかに?)
ここ4日間ぐらい、主にDataKinds
とTypeFamilies
を用いた型レベルハンバーガーの開発(型レベルプログラミング)を行っていた。
成果物はここにあるよ。
typeした型の中身を表示する:kind!
Hamberger.hsではこんな感じで、型レベル関数の結果を左辺に格納している。
type BasicHamburgerC = HamburgerC Space Space Space Space
type HamburgerC1 = AddTopping BasicHamburgerC Cheese
type HamburgerC2 = AddTopping HamburgerC1 Tomato
type HamburgerC3 = AddTopping HamburgerC2 Meet
type HamburgerC4 = AddTopping HamburgerC3 Ushi
type HamburgerC5 = AddTopping HamburgerC4 Ushi
例えばHamburgerC4
とHamburgerC5
の結果が見たいとき、
もしこれらが(Show
である)値であればprint
してあげればいいものの、これらは型である。
type
された型を展開して表示するには、GHCiで:kind!
を使う。
GHCi> :kind! HamburgerC4
HamburgerC4 :: HamburgerT
= 'HamburgerC 'Cheese 'Tomato 'Meet 'Ushi
GHCi> :kind! HamburgerC5
HamburgerC5 :: HamburgerT
= 'Fail
ちなみに:info
すれば、それらどうやって(値レベルでいう)束縛を行われたのか と
行われた箇所が見れる。
GHCi> :info HamburgerC4
type HamburgerC4 = AddTopping HamburgerC3 'Ushi :: HamburgerT
-- Defined at Hamburger.hs:59:1
GHCi> :info HamburgerC5
type HamburgerC5 = AddTopping HamburgerC4 'Ushi :: HamburgerT
-- Defined at Hamburger.hs:60:1
一言
ここの一連のtype
、よく関数ローカルでいくつかの名前をlet
していくのと似てるよねー。