рдпрд╣ рдкрд╛рда рдмреБрд▓реИрдЯ рдЬрд┐рдЧрдВрд╢рд┐рди рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╣реИред рд╕рдВрдкреВрд░реНрдг рдкрд╛рда рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдзрд╛рд░рдгрд╛ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд╛рд░реНрдХрд┐рдХ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд╛рда рдореЗрдВ рдЖрдЧреЗ рдХреЗ рдЗрдЯреИрд▓рд┐рдХреНрд╕ рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рдиреЛрдЯреНрд╕ рд╣реИрдВред рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ:рднреМрддрд┐рдХреАрдХрд░рдг
рд╕рд╛рдордЧреНрд░реАрдХрд░рдг (рдкреБрдирд░реАрдХреНрд╖рдг) рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╕рдВрдХрд▓рдХ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
тИ╖ Name тЖТ Q Info
рдлрд╝рдВрдХреНрд╢рди
тИ╖ Name тЖТ Q Info
рдХрд░рддрд╛ рд╣реИ
тИ╖ Name тЖТ Q Info
рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдирд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
тИ╖ Name тЖТ Q Info
рджреЗрддрд╛ рд╣реИ: рдпрджрд┐ рдпрд╣ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдлрд╝рдВрдХреНрд╢рди, рд╕реНрдерд┐рд░, рдирд┐рд░реНрдорд╛рддрд╛) рд╣реИ - рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рдорд┐рд▓реЗрдЧрд╛, рдпрджрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдпрд╛ рд╡рд░реНрдЧ рд╣реИ - рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рдорд┐рд▓ рдЬрд╛рдПрдЧреАред рдкреНрд░рдХрд╛рд░ рдХреА
Info
рдХреА рдкрд░рд┐рднрд╛рд╖рд╛
Language.Haskell.TH.Syntax
рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред
рднреМрддрд┐рдХрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдХреЛ рднреМрддрд┐рдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЙрджреНрдзреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
$(optimize [d| fib = тАж |])
рдпрд╛ рддреЛ
fib = $(optimize [| тАж |])
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореВрд▓ рд▓реЗрдЦ рднреМрддрд┐рдХрд╡рд╛рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИред рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╖рдп рдХрд┐рддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ - рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рдЬреНрдЮрд╛рди, reify
рдлрдВрдХреНрд╢рди рдФрд░ Info
рдЯрд╛рдЗрдк рддрдХ рд╣реА рд╕реАрдорд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрдереНрдп рд╕реЗ рдЬреБрдбрд╝реА рдХреБрдЫ рд╕реВрдХреНрд╖реНрдорддрд╛рдПрдБ рд╣реИрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рдирд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдпрджрд┐ рдпрд╣ рд╡рд┐рд╖рдп рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рддреЛ рдореИрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдиреЛрдЯ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ (рдпрд╛ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ)редрд▓рд╛рдЗрдЯ рдХреЗ рдирд╛рдо рдЙрджреНрдзреГрдд
рдмреНрдпрд╛рдЬ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рдирд╛рдо ()
тИ╖ Name
) рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк
mkName
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐
mkName
рдПрдХ
mkName
рдирд╛рдо рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╕рдВрджрд░реНрдн рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдФрд░ рдпрд╣рд╛рдБ рдХреЛрдб
VarE id тЖР [| foo |]
VarE id тЖР [| foo |]
рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдореЛрдВ рдХреЛ рдЙрджреНрдзреГрдд рдХрд░рдиреЗ рдХреЗ рдпреЛрдЧреНрдп рд╣реИ (
My.Own.Module.foo
рдХреБрдЫ
My.Own.Module.foo
), рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдб рдмрд╣реБрдд рдЕрдзрд┐рдХ
My.Own.Module.foo
рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡реИрдд рд╕рдВрджрд░реНрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдкрд╛рд╕ рдирд╛рдореЛрдВ рдХреЛ рдЙрджреНрдзреГрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рд╕рд░рд▓ рд░реВрдк рд╣реИ:
'foo
(
'foo
рд╕реЗ рдкрд╣рд▓реЗ рдПрдХрд▓ рдЙрджреНрдзрд░рдг) рдЯрд╛рдЗрдк
Name
рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдпреЛрдЧреНрдп рдирд╛рдо рд╣реИ рдЬреЛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛
foo
рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдб
let id = 'foo
рдХреЛрдб рдХреЗ рдЕрд░реНрде рдореЗрдВ рдмрд░рд╛рдмрд░ рд╣реИ
VarE id тЖР [| foo |]
VarE id тЖР [| foo |]
ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдПрдХ рд╕рд░рд▓
Name
рдкреНрд░рдХрд╛рд░ рд╣реИ (
Q Exp
рдпрд╛
Q Name
), рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
f тИ╖ Exp тЖТ Exp f (App (Var m) e) | m == 'map = тАж
рдпрд╣ рдирдпрд╛ рд░реВрдк рдлрд┐рд░ рднреА рдПрдХ рдЙрджреНрдзрд░рдг рд╣реИ рдФрд░ рдХреЛрд╖реНрдардХ рдХреЗ рдЙрджреНрдзрд░рдг рдХреЗ рд╕рдорд╛рди рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ
[| тАж |]
[| тАж |]
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрди рдмреНрд░реИрдХреЗрдЯ рдХреЗ рдЕрдВрджрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ (рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ:
[| 'foo |]
),
рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЧреНрд▓реВрдЗрдВрдЧ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ рднреА рдЕрд╕рдВрднрд╡ рд╣реИ: $( 'foo )
), рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Q тАж
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред Q тАж
ред рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдЗрд╕ рд░реВрдк рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпреЛрдЧреНрдп рдирд╛рдо рд▓реМрдЯрд╛рддреЗ рд╣реБрдПред
рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдирд╛рдорд╕реНрдерд╛рди рдЪреАрдЬреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рднрд╛рд╡
[| P |]
[| P |]
рдЕрд░реНрде рд╣реИ
[| P |]
рдХрд╛ рдбреЗрдЯрд╛ рдирд┐рд░реНрдорд╛рддрд╛, рдЬрдмрдХрд┐
[t| P |]
[t| P |]
рдЕрд░реНрде рд╣реИ
[t| P |]
рдХрд╛ рдкреНрд░рдХрд╛рд░
P
рдЗрд╕рд▓рд┐рдП, "рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрджреНрдзрд░рдг" рдХреЗ рд▓рд┐рдП, рдЗрди рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рджреЛ рдПрдХрд▓ рдЙрджреНрдзрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
'Foo
рдЕрд░реНрде рд╣реИ "рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ Foo
рдбреЗрдЯрд╛ рдирд┐рд░реНрдорд╛рддрд╛"'foo
рдЕрд░реНрде рд╣реИ "рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд╛рдо foo
"''Foo
рдЕрд░реНрде рд╣реИ "рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ Foo
рдХрд╛ рдирд┐рд░реНрдорд╛рдг"''foo
рдЕрд░реНрде рд╣реИ "рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ foo
"
Show
рдХреНрд▓рд╛рд╕ рдХреЗ рдЕрд╡рддрд╛рд░реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рд╣рд▓реНрдХреЗ рдкреНрд░рд╢рд╕реНрддрд┐ рдкрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЕрдВрдд рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдФрд░ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐
рдкреНрд░рд╢рд╕реНрддрд┐ рдкрддреНрд░ рдореЛрдирд╛рдб рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдФрд░ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
report тИ╖ Bool тЖТ String тЖТ Q ()
report
рдлрд╝рдВрдХреНрд╢рди рджреВрд╕рд░реЗ рддрд░реНрдХ рдореЗрдВ рджрд┐рдП рдЧрдП рд╕рдВрджреЗрд╢ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдкрд╣рд▓рд╛ рддрд░реНрдХ
True
, рддреЛ рдкрд░рд┐рдгрд╛рдо рдХреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛, рд╕рдВрджреЗрд╢ рдмрд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (
рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд░реВрдк рдореЗрдВ )ред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЧрдгрдирд╛ рдЬрд╛рд░реА рд░рд╣рддреА рд╣реИ, рдЕрдЧрд░ рдЙрдиреНрд╣реЗрдВ рд░реЛрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдореЛрдирдб
fail
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрджрд┐ рдХреЛрдИ "рдХреНрд▓реЛрдЬрд╝рд┐рдВрдЧ"
recover
, рддреЛ рд╕рдВрдХрд▓рди рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
recover тИ╖ Q a тЖТ Q a тЖТ Q a
recover ab
рдХреЛ
recover ab
рдХрд░рдиреЗ рдХреЗ
recover ab
рдПрдХ рдХреЙрд▓ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ
b
ред рдЕрдЧрд░
b
рдХреА
report True "тАж"
рд╣реИ, рддреЛ
a
ред рдпрджрд┐
b
рдРрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░
a
рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛
a
рд╣реИред
location тИ╖ Q Loc
рдпрд╣ рдХреЛрдб рдореЗрдВ рд╕реНрдерд╛рди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (рд╕реНрдерд╛рдиреАрдп рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ) рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╡рд░реНрддрдорд╛рди рдЧреНрд▓реВрдЗрдВрдЧ рд╣реЛ рд░рд╣рд╛ рд╣реИ - рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдбрд┐рдмрдЧрд┐рдВрдЧ
рдЯреАрдПрдЪ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреАрдПрдЪрд╕реА рдПрдХ рд╡рд┐рд╢реЗрд╖ рдзреНрд╡рдЬ
-ddump-splices
рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдпрд╣ рдореЙрдбреНрдпреВрд▓ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рд╕рднреА рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ рдЪрд┐рдкрдХрд╛рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ, рдЖрдк рдлрд╝рдВрдХреНрд╢рди
runQ
тИ╖ Q a тЖТ IO a
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
тИ╖ Q a тЖТ IO a
рдореЗрдВ рдЧрдгрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдпрд╛ рддреЛ рд╕рд╛рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ (AST) рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд Hellell рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$ ghci тАУXTemplateHaskell тАж Prelude> :m + Language.Haskell.TH Prelude Language.Haskell.TH> runQ [| \x _ -> x |] >>= print LamE [VarP x_1,WildP] (VarE x_1) Prelude Language.Haskell.TH> runQ [| \x _ -> x |] >>= putStrLn . pprint \x_0 _ -> x_0
pprint
рдлрдВрдХреНрд╢рди рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЪрд┐рдкрдХрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдЧреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд░рд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рд▓реИрдореНрдмрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рддрд░реНрдХреЛрдВ рдХреА рдЕрдирджреЗрдЦреА рдХрд░рддрд╛ рд╣реИ рдФрд░ рджрд┐рдП рдЧрдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
module Cnst where import Language.Haskell.TH cnst :: Int -> String -> Q Exp cnst ns = return (LamE (replicate n WildP) (LitE (StringL s)))
рдЕрдм рдпрд╣ рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
$ ghci -XTemplateHaskell Cnst.hs тАж *Cnst> runQ (cnst 2 "str") >>= print LamE [WildP,WildP] (LitE (StringL "str")) *Cnst> runQ (cnst 2 "str") >>= putStrLn . pprint \_ _ -> "str"
рдПрдХ рд╣реА рдмрд╛рдд рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдпрд╛рдд рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕:
{-# LANGUAGE TemplateHaskell #-} module Main where import Language.Haskell.TH import Cnst -- cnst : cnst1 :: t -> [Char] cnst1 = $(cnst 1 "x") cnst2 :: t1 -> t2 -> [Char] cnst2 = $(cnst 2 "str") -- , 20 cnst20 = $(cnst 20 "foo") -- , runQ: main = do runQ(cnst 1 "x") >>= print runQ(cnst 2 "str") >>= print runQ(cnst 20 "foo") >>= print runQ(cnst 1 "x") >>= putStrLn.pprint runQ(cnst 2 "str") >>= putStrLn.pprint runQ(cnst 20 "foo") >>= putStrLn.pprint
рдЙрджрд╛рд╣рд░рдг: deriveShow
рдпрд╣ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдПрд╕рдЯреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рд╣рд▓реНрдХреЗ рдЙрджреНрдзрд░рдг, рдХреЛрд╖реНрдардХ рдХреЗ рдЙрджреНрдзрд░рдг, рднреМрддрд┐рдХрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ рдЬреЛ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереАред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗрд╡рд▓ рд╕рд░рд▓ рдмреАрдЬреАрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд┐рдирд╛, рдирд╛рдо рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рдмрд┐рдирд╛, рдЖрджрд┐)
рдореИрдВрдиреЗ рдореВрд▓ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдХрд┐рдП рд╣реИрдВ (рдЕрд▓рдЧ рд╕реЗ рдкрдардиреАрдпрддрд╛ рдореЗрдВ), рдЕрд▓рдЧ рд╕реЗ showClause
рдлрд╝рдВрдХреНрд╢рди рд╕рд╣рд┐рддред {-# LANGUAGE TemplateHaskell #-} module Main where import Derive data T = A Int String | B Integer | C $(deriveShow ''T) main = print [A 1 "s", B 2, C]
{-# LANGUAGE TemplateHaskell #-} module Derive where import Language.Haskell.TH import Control.Monad data T1 = T1 -- , -- n genPE :: Int -> Q ([PatQ], [ExpQ]) genPE n = do ids <- replicateM n (newName "x") return (map varP ids, map varE ids) -- show : -- show (A x1 x2) = "A "++show x1++" "++show x2 showClause :: Con -> Q Clause showClause (NormalC name fields) = do -- , .. "A". nameBase let constructorName = nameBase name -- (pats,vars) <- genPE (length fields) -- (" "++show x1++...++"") [x1, ...] let f [] = [| constructorName |] f (v:vars) = [| " " ++ show $v ++ $(f vars) |] -- clause [conP name pats] -- (A x1 x2) (normalB (f vars)) [] -- "A"++" "++show x1++" "++show x2 -- , Show deriveShow :: Name -> Q [Dec] deriveShow t = do -- t TyConI (DataD _ _ _ constructors _) <- reify t -- show: -- show (A x1 x2) = "A "++show x1++" "++show x2 -- show (B x1) = "B "++show x1 -- show C = "C" showbody <- mapM showClause constructors -- -- (T1) (x = "text") showbody d <- [d| instance Show T1 where show x = "text" |] let [InstanceD [] (AppT showt (ConT _T1)) [FunD showf _text]] = d return [InstanceD [] (AppT showt (ConT t )) [FunD showf showbody]]
рдирд┐рд╖реНрдХрд░реНрд╖
рдпрд╣ рд▓реЗрдЦ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдиреЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдореЗрдЯреНрд╕рдХреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдореБрдЦреНрдп рд╡рд┐рд╖рдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рдкрд░рд┐рдЪрдп рд╣реБрдЖ рд╣реИред рд╡рд┐рд╖рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдпрд╣ TH рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреГрд╖реНрда рдкрд░ рджреЗрдЦрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдк рдЕрдиреНрдп рд▓реЗрдЦреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдФрд░ рдХрдИ рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред