29. lib2 =
let
l=LetS[ValD(VarP $ mkName"it")(NormalB(f"be"))[]]
f=VarE . mkName
in
DoE [ l, l, l, NoBindS $ f"oh",l,
NoBindS $ InfixE(Just$ f"speaking")(f"words")(Just $ f "wisdom"),l]
30. lib2 =
let
l=LetS[ValD(VarP $ mkName"it")(NormalB(f"be"))[]]
f=VarE . mkName
in
DoE [ l, l, l, NoBindS $ f"oh",l,
NoBindS $ InfixE(Just$ f"speaking")(f"words")(Just $ f "wisdom"),l]
do let it = be
let it = be
let it = be
oh
let it = be
speaking `words` wisdom
let it = be
31. k
GHCi
GHCi> runQ [d| data List a = Cons a (List a) | Nil |]
[DataD [] List [PlainTV a_0] [NormalC Cons [(NotStrict,VarT a_0),
(NotStrict,AppT (ConT List) (VarT a_0))],NormalC Nil []] []]
93. Sum of Product
( )
{-# LANGUAGE Generics, TypeOperators #-}
94. Sum of Product
( )
{-# LANGUAGE Generics, TypeOperators #-}
import GHC.Generics
95. data Bool = False | True
= Unit :+: Unit
data Maybe a = Nothing | Just a
= Unit :+: a
Just 12 = Inr 12, Nothing = Inl Unit
data List a = Nil | Cons a (List a)
= Unit :+: (a :*: (List a))
[1,2,3] = Inr (1 :*: Inr (2 :*:
Inr (3 :*: Inl Unit)))
96. Binary Encode
class Bin a where
toBin :: a → [Int]
fromBin :: [Int] → (a, [Int])
toBin {| Unit |} Unit = [0]
toBin {| p :*: q |} (a :*: b) = toBin a ++ toBin b
toBin {| p :+: q |} (Inl a) = 0:toBin a
toBin {| p :+: q |} (Inr b) = 1:toBin b
fromBin {| Unit |} (0:xs) = (Unit, xs)
fromBin {| p :*: q |} bin =
let (a, bin') = fromBin bin
(b, bin'') = fromBin bin'
...
97. class Bin a where
toBin :: a → [Int]
fromBin :: [Int] → (a, [Int])
toBin {| Unit |} Unit = [0]
toBin {| p :*: q |} (a :*: b) = toBin a ++ toBin b
toBin {| p :+: q |} (Inl a) = 0:toBin a
toBin {| p :+: q |} (Inr b) = 1:toBin b
fromBin {| Unit |} (0:xs) = (Unit, xs)
fromBin {| p :*: q |} bin =
let (a, bin') = fromBin bin
(b, bin'') = fromBin bin'
in ...
98. class Bin a where
toBin :: a → [Int]
fromBin :: [Int] → (a, [Int])
toBin {| Unit |} Unit = [0]
toBin {| p :*: q |} (a :*: b) = toBin a ++ toBin b
toBin {| p :+: q |} (Inl a) = 0:toBin a
toBin {| p :+: q |} (Inr b) = 1:toBin b
fromBin {| Unit |} (0:xs) = (Unit, xs)
fromBin {| p :*: q |} bin =
let (a, bin') = fromBin bin
(b, bin'') = fromBin bin' in (a :*: b, bin’’)
...
99. ( Int, Char) instance
instance Bin Int where
toBin = ....
instance Bin Char where
toBin = ...
instance Bin a Bin [a]
instance (Bin a, Bin b) Bin (a, b)
instance Bin a Bin (Maybe a)
instance (Bin a, Bin b) Bin (Either a b)
107. Typeable / Data
GHC
{-# LANGUAGE DeriveDataTypeable #-}
data Tree a = Leaf a | Branch (Tree a) (Tree a)
deriving (Data, Typeable)
Standalone deriving
{-# LANGUAGE StandaloneDeriving #-}
deriving instance Typeable1 Tree
deriving instance Data a Data (Tree a)
108. --
data Expr = Num Int
| Var String
| Plus Expr Expr
| Minus Expr Expr
| Multi Expr Expr
| Div Expr Expr
deriving (Show, Eq, Data, Typeable)
normalize :: Expr → Expr
normalize = everywhere (mkT normalize')
normalize' (Plus (Num n) (Num m)) = Num (n + m)
normalize' (Multi (Num n) (Num m)) = Num (n * m)
normalize' (Minus (Num n) (Num m)) = Num (n - m)
normalize' (Div (Num n) (Num m)) = Num (n `div` m)
normalize' x =x
115. SYB
mkT :: (b → b) → (a → a)
everywhere :: GenericT → GenericT
116. SYB
mkT :: (b → b) → (a → a)
everywhere :: GenericT → GenericT
bottom-up
117. SYB
mkT :: (b → b) → (a → a)
everywhere :: GenericT → GenericT
bottom-up
top-down everywhere'
118. (1)
GenericT = ∀a. a → a
Transformer
mkT fun
trans `extT` fun
GenericM = ∀a. a → m a :
GenericQ = ∀a. a → r
Query
( ) `mkQ` fun
query `extQ` fun
119. (2)
GenericB = ∀a. a
Builder
builder `extB` fun
GenericR = ∀a. m a
Reader
mkR fun
reader `extR` fun
120. gmapT :: GenericT → a → a
somewhere :: GenericM m → GenecirM m
everything :: (r → r → r) → GenericQ r → GenericQ r
listify :: (r → Bool) → GenericQ [r]
gsize/glength :: GenericQ Int
134. IG
Representable a
type Rep a
data U = U
data a :+: b = L a | R b ( )
data a :*: b = a :*: b
data C con a = C a
data Var p = Var p
data Rec p = Rec p
135. Int, Bool Int, Bool
data Maybe a = Nothing | Just a
type Rep (Maybe a)
= C Maybe_Nothing_ U
:+: C Maybe_Just_ (Var a)
Just 12 = R(C(Var 12)), Nothing = L(C U)
136. Int, Bool Int, Bool
data Maybe a = Nothing | Just a
type Rep (Maybe a)
= C Maybe_Nothing_ U
:+: C Maybe_Just_ (Var a)
Just 12 = R(C(Var 12)), Nothing = L(C U)
137. 1 Binary Encode
class Bin a where
toBin :: a → [Int]
fromBin :: [Int] → (a, [Int])
C, Var, Rec
instance Bin U where
toBin U = []
fromBin xs = (U, [])
instance (Bin a, Bin b) Bin (a :+: b) where
toBin (L a) = 0:toBin a
toBin (R b) = 1:toBin b
fromBin (0:bin) = ...
...
instance (Bin a, Bin b) Bin (a :*: b) where
toBin (a :*: b) = toBin a ++ toBin b
fromBin bin = ...
instance Bin Int where
...
138. def_toBin :: (Representable a, Bin (Rep a))
a → [Int]
def_toBin = toBin . from
...
instance Bin a Bin [a] where
toBin = def_toBin; fromBin = def_fromBin
139. 2
! class Normalize a where
normalize :: a → a
instance Normalize U
instance Normalize (Var a)
...
instance Normalize a Normalize (Rec a) where
normalize (Rec a) = Rec (normalize a)
140. 2
! class Normalize a where
normalize :: a → a
instance Normalize U
instance Normalize (Var a)
...
instance Normalize a Normalize (Rec a) where
normalize (Rec a) = Rec (normalize a)
141. 2
! class Normalize a where
normalize :: a → a
instance Normalize U
instance Normalize (Var a)
...
instance Normalize a Normalize (Rec a) where
normalize (Rec a) = Rec (normalize a)
142. 2
! class Normalize a where
normalize :: a → a
instance Normalize U
instance Normalize (Var a)
...
instance Normalize a Normalize (Rec a) where
normalize (Rec a) = Rec (normalize a)
143. Expr
dft_normalize
:: (Representable a, Normalize (Rep a)) a→a
dft_normalize = to . normalize . from
instance Normalize Expr where
normalize x = case dft_normalize x of
Plus (Num n) (Num m) → Num (n + m)
Multi (Num n) (Num m) → Num (n * m)
Minus (Num n) (Num m) → Num (n - m)
Div (Num n) (Num m) → Num (n `div` m)
x →x
Var Int, Char