рдпрд╣ рдкрд╛рда рдмреБрд▓реИрдЯ рдЬрд┐рдЧрдВрд╢рд┐рди рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╣реИред рд╕рдВрдкреВрд░реНрдг рдкрд╛рда рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдзрд╛рд░рдгрд╛ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд╛рд░реНрдХрд┐рдХ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд╛рда рдореЗрдВ рдЖрдЧреЗ рдХреЗ рдЗрдЯреИрд▓рд┐рдХреНрд╕ рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рдиреЛрдЯреНрд╕ рд╣реИрдВред рдЕрдиреНрдп рднрд╛рдЧреЛрдВ:рдкреНрд░рд╢рд╕реНрддрд┐ рдкрддреНрд░ рдореЛрдирд╛рдб
рдЪреВрдБрдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ
Q
рдореЛрдирдб рдореЗрдВ рд▓рд┐рдкрдЯреЗ рдЕрдкрдиреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬреЛ "
lamE
" (
Q
рдореЗрдВ рд▓рдкреЗрдЯреЗрдВ)
lamE
,
Lit
,
Pat
:
lamE
(
LamE
ред
LamE
),
varE
,
appE
,
varP
, рдЖрджрд┐ рдХреЗ
varP
ред рдШред рдЙрдирдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдореЗрдВ, рдлрд┐рд░ рд╕реЗ рдЙрдард╛рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
ExpQ = Q Exp
,
LitQ = Q Lit
,
PatQ = Q Pat
... (рдпреЗ рд╕рднреА
Language.Haskell.TH.Lib
рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЗрди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдХреЛрдб рдХреЛ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдо-рд╕реЗ-рдХрдо рдЕрдХреНрд╕рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред
TH рдореЗрдВ рдПрдХ
lift
рдлрд╝рдВрдХреНрд╢рди рднреА рд╣реЛрддрд╛ рд╣реИ рдЬреЛ
Lift
рд╡рд░реНрдЧ рдХреЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ
Q Exp
рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред
рдХреБрдЫ рджреБрд░реНрд▓рдн рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдмрд▓реНрдХрд┐ рдмрд╛рд╣рд░реА
(рдЯреЗрдореНрдкрд▓реЗрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖) рдХреЛрдб рд╕реЗ рд╕рдЯреАрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╢реБрджреНрдз (рд╢реБрджреНрдз) рдлрд╝рдВрдХреНрд╢рди рд╣реИ
mkName
тИ╖ String тЖТ Name
ред рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди
dyn
s = return (VarE (mkName s))
, рдЬреЛ рджрд┐рдП рдЧрдП рдирд╛рдо (
dyn тИ╖ String тЖТ Q Exp
) рдХреЗ рд╕рд╛рде рдПрдХ рдЪрд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ
Exp
рдорд╛рди рджреЗрддрд╛ рд╣реИред
рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрджреНрдзрд░рдг
рдмрд┐рд▓реНрдбрд┐рдВрдЧ
Exp
рд╡реИрд▓реНрдпреВ рдПрдХ рдЕрдореВрд░реНрдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓реА рдФрд░ рдЙрдмрд╛рдК рдХрд╛рдо рд╣реИред рд▓реЗрдХрд┐рди рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдРрд╕реЗ рдХреЛрд╖реНрдардХ рдЙрджреНрдзреГрдд рдХрд┐рдП рдЧрдП рд╣реИрдВ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛрдб рдХреЛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВред
рд╡реЗ рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ:
[e| тАж |]
[e| тАж |]
рдпрд╛ [| тАж |]
[| тАж |]
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП ( тИ╖ Q Exp
)[d| тАж |]
[d| тАж |]
рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рд▓рд┐рдП ( тИ╖ Q [Dec]
)[t| тАж |]
[t| тАж |]
рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП ( тИ╖ Q Type
)[p| тАж |]
[p| тАж |]
рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП ( тИ╖ Q Pat
)
рддрджрдиреБрд╕рд╛рд░, рдмреНрд░реИрдХреЗрдЯ рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рд╣реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ / рдШреЛрд╖рдгрд╛ / рдкреНрд░рдХрд╛рд░ / рдкреИрдЯрд░реНрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрджреНрдзрд░рдг
[| ╬╗ _ тЖТ 0 |]
[| ╬╗ _ тЖТ 0 |]
рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ
(return $ LamE [WildP] (LitE (IntegerL 0)))
ред рдЙрджреНрдзрд░рдг
Q Exp
(рдФрд░ рди рдХреЗрд╡рд▓
Exp
) рдХрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкреНрд░рд╢рд╕реНрддрд┐ рдкрддреНрд░ рдореЛрдирд╛рдб рдХреЗ рдЕрдВрджрд░ рдЧрдгрдирд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛ рдЙрджреНрдзрд░рдг рдХреЗ рдЕрдВрджрд░ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ
newName
рд╕рд╛рде рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА
newName
ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрджреНрдзрд░рдг
[| ╬╗x тЖТ x |]
[| ╬╗x тЖТ x |]
рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
do id тЖР newName "x" return $ LamE [VarP id] (VarE id)
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрджреНрдзреГрдд рдХреЛрд╖реНрдардХ рдХреЗ рдЕрдВрджрд░, рд╣рдо рдЧреНрд▓реВрдЗрдВрдЧ (рд╕реНрдкреНрд▓рд┐рд╕рд┐рдВрдЧ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ TH рдПрдХ рдореИрдХреНрд░реЛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдФрд░ рдЙрддреНрдкрдиреНрди рднрд╛рдЧ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрджреНрдзрд░рдг
[| 1 + $(fx) |]
[| 1 + $(fx) |]
рдЧрдгрдирд╛
[| 1 + $(fx) |]
(fx)
, рдЬреЛ рдЯрд╛рдЗрдк
Q Exp
рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдХреНрд╕рдкреНрд░реЗрд╢рди (рдЯрд╛рдЗрдк
Exp
рдХреА рд╕рдВрд░рдЪрдирд╛), рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕реЗ
$(fx)
рд╕реНрдерд╛рди рдкрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд (
рдкреЗрд╕реНрдЯ ) рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЙрджреНрдзрд░рдг рдЬрд╛рд░реА рд░рдЦреЗрдВ - рдкрд░рд┐рдгрд╛рдореА рдХреЛрдб рдХреЛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдЬреЛ рдЗрд╕рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдирд╛рдордХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж
(рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП, Q
рдореЛрдирдб рдХреЗ рдЕрдВрджрд░ рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) , рдмреЛрд▓реА рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╣реА рдХреЛрдб рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЖрд╡реЗрд╖рдгреЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдирд╛рдореЛрдВ рдХрд╛ рдХреЛрдИ рдЯрдХрд░рд╛рд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИ:
summ тИ╖ Int тЖТ Q Exp summ n = summ' n [| 0 |] summ' тИ╖ Int тЖТ Q Exp тЖТ Q Exp summ' 0 code = code summ' n code = [| ╬╗x тЖТ $(summ' (n-1) [| $code + x |]) |]
рдпрд╣ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЙрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдмреЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
$(summ 3)
рдХреЛ
(╬╗x1 тЖТ ╬╗x2 тЖТ ╬╗x3 тЖТ 0 + x1 + x2 + x3)
$(summ 3)
рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛
$(summ 3)
ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдиреЗрд╕реНрдЯреЗрдб рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдирд╛рдо рд╕рдорд╛рди рд╣реИ:
[| ╬╗x тЖТ тАж |]
[| ╬╗x тЖТ тАж |]
| рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ,
рдЙрджреНрдзрд░рдг рдФрд░ рд▓реЗрдмрд▓ рдХрд╛ рдШреЛрдВрд╕рд▓рд╛ рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╡реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ - рдЖрдк рдЙрджреНрдзрд░рдг рдХреЗ рдЕрдВрджрд░ рдФрд░ рдкреЗрд╕реНрдЯ рдХреЗ рдЕрдВрджрд░ рдЙрджреНрдзрд░рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ "рдЕрд░реНрдз-рдЙрджреНрдзрд░рдг" рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХреА рдХреБрдЫ рд╕реАрдорд╛рдПрдБ рд╣реИрдВ: рдПрдХ рдЪрд░ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдирд╛ рдЙрд╕ рдорд╛рди рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛрддреА рд╣реИ рдЬреЛ рддрдм рддрдХ рдЙрдкрд▓рдмреНрдз рдЧреБрдВрдЬрд╛рдЗрд╢ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред рдЗрд╕ рдирд┐рдпрдо рдХреЗ рддреАрди рдорд╛рдорд▓реЗ рд╣реИрдВ:
- рдХреЛрд╖реНрдардХ рдХреЛ рдЙрджреНрдзреГрдд рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╕реЗ рджреВрд╕рд░реЗ рдЙрджреНрдзрд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ "рдХреИрдкреНрдЪрд░" рдкрд░ рд░реЛрдХ рд▓рдЧрд╛рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдПрдХ рдирд┐рдпрдорд┐рдд рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд╣рд░ рдХреНрд▓реЛрдЬрд░ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдпрд╣ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкреВрд░реНрд╡реЛрдХреНрдд рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдПрдХреАрдХрд░рдг рдХреЗ рдХрд╛рд░рдг рд╣реИред рдЙрджреНрдзрд░рдг рдХреЗрд╡рд▓
[p| тАж |]
[p| тАж |]
рдЙрди рдЪрд░ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ рдЬреЛ рдЙрддреНрдкрдиреНрди рдкреИрдЯрд░реНрди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ (рдЪреВрдВрдХрд┐ рдпреЗ рдЪрд░ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╣реЛрдВрдЧреЗ рдФрд░ рдпрджрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдирдП рдордирдорд╛рдиреЗ рдирд╛рдо рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдП) ред - рдХреЛрдЯреЗрд╢рди рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рд╡реИрд╢реНрд╡рд┐рдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдЬрд╣рд╛рдВ рдЙрджреНрдзрд░рдг рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдлрд┐рд░ рд╕реЗ, рд╕рд╛рдорд╛рдиреНрдп рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрджреНрдзрд░рдг рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдирдХреА рдЗрди рд╕рднреА рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдорд╛рди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдирдХреА рдЕрдкрдиреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВред рдпрд╣ рдирд┐рдпрдо рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдкреНрд░рддреАрдХ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рдЬреАрдПрдЪрд╕реА рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдпреЛрдЧреНрдп рдмрдирд╛рддрд╛ рд╣реИ) ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрджреНрдзрд░рдг
[| map |]
[| map |]
рдХреЛ " GHC.Base.map
" рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ [t| [String] тЖТ Bool |]
[t| [String] тЖТ Bool |]
рдХреЛ " [GHC.Base.String] тЖТ GHC.Bool.Bool
" [t| [String] тЖТ Bool |]
рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЪрд┐рдкрдХрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рдЙрдирдХреЗ рд▓рд┐рдП $(dyn "тАж")
рд░реИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдЧрд▓рддреА рд╕реЗ рдХрд┐рд╕реА рдФрд░ рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рдВрдШрд░реНрд╖ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛ рдпрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЙрд╕ рдХреЛрдб рдХреЛ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП dyn
рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИред - рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрд╖реНрдардХ рдХреЗ рдЙрджреНрдзрд░рдг рдХреЗ рдЕрдВрджрд░, рдЖрдк рд╕реНрдерд╛рдиреАрдп рдлрд╝рдВрдХреНрд╢рди рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрдХрд▓рди рдХреЗ рдЪрд░рдг рдореЗрдВ, рдпреЗ рдЪрд░ (рдмрд╕ рд╕рдВрдмрдВрдзрд┐рдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛) рд╣реИрдВ, рд▓реЗрдХрд┐рди рд░рдирдЯрд╛рдЗрдо рдкрд░, рд╡реЗ рд╕рд┐рд░реНрдл рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП TH рдЙрдирдХреЗ рд╕реНрдерд╛рди рдкрд░ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рдиреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рджреЗрдЧрд╛ред рддреЛ, рдПрдХреНрд╕рдкреНрд░реЗрд╢рди
let x = 5 in [| тАж x тАж |]
let x = 5 in [| тАж x тАж |]
рдХреЛ let x = 5 in [| тАж $(lift x) тАж |]
let x = 5 in [| тАж $(lift x) тАж |]
- рдЕрд░реНрдерд╛рдд, рдЖрдкрдХреЛ Q Exp
рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ ред
рдЪрд┐рдкрдХрд╛рдирд╛ рдФрд░ рдЙрджреНрдзреГрдд рдХрд░рдирд╛ рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрд▓рдЯрд╛ рдСрдкрд░реЗрд╢рди рд╣реИ: рдПрдХ
Exp
рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛрдб рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛрдб рдХреЛ рдПрдХ
Exp
рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд░реНрд╡рдирд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ:
$( [| |] ) тЙб [| $( ) |] тЙб
рдпрд╣ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ TH рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "
$(summ 3)
" рдХреА рдЧрдгрдирд╛
$(summ 3)
ред рд╣рдо рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗ:
$(summ 3) $(summ' 3 [| 0 |]) $([| ╬╗x тЖТ $(summ' (3-1) [| $([| 0 |]) + x |]) |])
рдЕрдм рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдмреНрд░реИрдХреЗрдЯ
$([| тАж |])
рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде "
x
" рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
╬╗x1 тЖТ $(summ' (3-1) [| 0 + x1 |])
рдпреЛрдЧ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ
summ'
:
╬╗x1 тЖТ $([| ╬╗x тЖТ $(summ' (2-1) [| $([| 0 + x1 |]) + x |]) |])
рдЕрдЧрд▓рд╛, рд╣рдо рдЕрдВрддрд┐рдо рджреЛ рдЪрд░рдгреЛрдВ рдХреЛ рддрдм рддрдХ рджреЛрд╣рд░рд╛рдПрдВрдЧреЗ рдЬрдм рддрдХ рдпрд╣ рд╕рдВрднрд╡ рди рд╣реЛ:
╬╗x1 тЖТ ╬╗x2 тЖТ $( summ' (2-1) [| 0 + x1 + x2 |] ) ╬╗x1 тЖТ ╬╗x2 тЖТ $([| ╬╗x тЖТ $(summ' (1-1) [| $([| 0 + x1 + x2 |]) + x |]) |]) ╬╗x1 тЖТ ╬╗x2 тЖТ ╬╗x3 тЖТ $(summ' (1-1) [| 0 + x1 + x2 + x3 |]) ╬╗x1 тЖТ ╬╗x2 тЖТ ╬╗x3 тЖТ $( [| 0 + x1 + x2 + x3 |]) ╬╗x1 тЖТ ╬╗x2 тЖТ ╬╗x3 тЖТ 0 + x1 + x2 + x3
рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ, рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (
╬╗x1 тЖТ ╬╗x2 тЖТ тАж
) рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЗ рдорд╛рд░реНрдЧ рдХреЗ рд╕рд╛рде рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрдмрдХрд┐ рджрд╛рдИрдВ рдУрд░ (
0 + x1 + тАж
) рдмрд╛рдХреА рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдЙрд╕реА рд╕рдордп рдЬрдорд╛ рд╣реБрдЖ рд╣реИред рдЙрд╕реА рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг
printf
рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг: рдкреНрд░рд┐рдВрдЯрдл
рдЕрдм рд╣рдо
printf
рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдХреЛрдб рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рднреА рд╣реИред рдЖрдк рдЗрд╕реЗ рдХрдорд╛рдВрдб
ghc -XTemplateHaskell --make Main.hs
рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
- Main.hs
{-# LANGUAGE TemplateHaskell #-} module Main where -- printf import Printf (printf) -- $( тАж ) -- Haskell- -- тАУ putStrLn main = putStrLn ( $(printf "Error in file %s line %d: %s") "io.cpp" 325 "printer not found" )
Printf.hs
{-# LANGUAGE TemplateHaskell #-} module Printf where -- Template Haskell import Language.Haskell.TH -- data Format = D -- "%d" тАУ | S -- "%s" тАУ | L String -- (L Literally) -- тАУ Format parse :: String -> String -> [Format] parse "" rest = [L rest] parse ('%':'d':xs) rest = L rest : D : parse xs "" parse ('%':'s':xs) rest = L rest : S : parse xs "" parse (x:xs) rest = parse xs (rest++[x]) -- Haskell-, -- - gen :: [Format] -> ExpQ -> ExpQ gen [] code = code gen (D : xs) code = [| \x -> $(gen xs [| $code ++ show x |]) |] gen (S : xs) code = [| \x -> $(gen xs [| $code ++ x |]) |] gen (L s : xs) code = gen xs [| $code ++ s |] -- , -- printf :: String -> ExpQ printf s = gen (parse s "") [| "" |]
рдпрд╣ рдЕрдиреБрд╡рд╛рджрд┐рдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╡рд╛рд▓рд╛ рд▓реЗрдЦрдХ рдХреЛрдб рд╣реИред рдПрдХ рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рдХрдо (рдФрд░ рд╕рд░рд▓, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ) рд╕рдорд╛рдзрд╛рди рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЬрд┐рд╕реНрдЯ ред
рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг
рдореИрдВрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ рдЙрджреНрдзреГрдд рдХрд░рдиреЗ рдФрд░ рдирд╛рдореЛрдВ рдХреЛ рдЪрд┐рдкрдХрд╛рдиреЗ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ - рдпреЗ рдкреНрд░рдпреЛрдЧ рдореЗрд░реЗ рдмреНрд▓реЙрдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред рдореБрдЭреЗ рд╕рд▓рд╛рд╣ рдФрд░ рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред