имплементация рекордов
data Rec fields where
Rec :: fields => Rec fields
infixr 1 ?
(?) :: Rec fields -> (fields => r) -> r
Rec ? e = e
— готово
type RXY = Rec (?x::Int, ?y::Int)
xy, xy' :: RXY
xy = let ?x = 1; ?y = 2 in Rec
xy' = Rec where ?x = 3; ?y = 4
foo :: RXY -> Int
foo r = r ? ?x + ?y
type RZ = Rec (?z::Int)
z :: RZ
z = Rec where ?z = 42
— type RXYZ = (RXY, RZ)
type RXYZ = Rec (?x::Int, ?y::Int, ?z::Int)
xyz :: RXYZ
xyz = xy ? z ? Rec — concatenation
t1 = foo xy
t2 = foo (xyz ? Rec) — subtyping
t3 = foo (xy ? Rec)
main = print $ foo xy
отличный синтакс абьюз
то я попутал, когда чувак переносил с Dict на квантифаед, это я про free-functors там сабконстрейнты были, типа супер класс
Обсуждают сегодня