AA
Size: a a a
AA
AV
AA
YS
YS
YS
Y
data Expr = Int Int | Bool Bool | Add Expr Expr | If Expr Expr Expr
data Expr a where
Int :: Int -> Expr Int
Bool :: Bool -> Expr Bool
Add :: Expr Int -> Expr Int -> Expr Int
If :: Expr Bool -> Expr a -> Expr a
YS
YS
к
data T a
= TBool {a ~ Int} Bool
| TInt {a ~ Bool} Int
coe :: a -> a ~ b -> b
sym :: a ~ b -> b ~ a
f :: T a -> a
f (TBool {p :: a ~ Int} True) =
(coe (sym p) (1 :: Int)) :: a
f (TBool {p :: a ~ Int} False) =
(coe (sym p) (0 :: Int)) :: a
f (TInt {p :: a ~ Bool} (x :: Int)) =
(coe (sym p) ((x == 0) :: Bool)) :: a
YS
YS
YS
YS
к
coe
на самом деле cast
, я перепутал