PureScriptの型レベルプログラミング
from PureScriptのRecord型俯瞰
pursの型レベルプログラミング
table:こんな対応のイメージ
普通 | 関数の型 関数のbody
型レベル | 型クラス instance
purescript-typelevel-preludeというLibraryが良い感じ
https://pursuit.purescript.org/packages/purescript-typelevel-prelude/6.0.0
IfとかOrみたいな型レベルプログラミング用の型が提供されている
https://qiita.com/kimagure/items/fd05ad13ee8def0fb4ed
やってることはよくわからないが、IfとかOrとかを組み合わせて型型してる
RowToList型クラスを使ったもの
RowToListであそぼう!(苦悶) - Qiita
Extractの部分は
code:purs(hs)
class Extract :: ∀ k. RowList k -> RowList k -> Constraint
class Extract xs ys | xs -> ys
instance extractNil :: Extract Nil Nil
else instance extractCons :: Extract ys zs => Extract (Cons key (Aff value) ys) (Cons key value zs)
これはこんな関数を型レベルで書いている感じ
「instanceで関数のbodyを書いている」がそのまま表現されている
code:purs(hs)
extract Nil = Nil
extractCons (Cons key (Aff value) ys) = Cons key value zs
PureScript 0.12.0 で何が変わったか - レコード編 - Qiita
RecordをEQ型クラスのinstanceにする実装を例に。
https://qiita.com/kimagure/items/141423771ad1f5a84425
https://qiita.com/kimagure/items/7a0d1675522c09b4bcb6
https://qiita.com/kimagure/items/c4bc704df3791437c9bb