рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рдкрд░рд┐рдЪрдпред рднрд╛рдЧ 3. рдЯреАрдПрдЪ рдХреЗ рдЕрдиреНрдп рдкрд╣рд▓реВ

рдпрд╣ рдкрд╛рда рдмреБрд▓реИрдЯ рдЬрд┐рдЧрдВрд╢рд┐рди рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╣реИред рд╕рдВрдкреВрд░реНрдг рдкрд╛рда рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдзрд╛рд░рдгрд╛ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд╛рд░реНрдХрд┐рдХ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд╛рда рдореЗрдВ рдЖрдЧреЗ рдХреЗ рдЗрдЯреИрд▓рд┐рдХреНрд╕ рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рдиреЛрдЯреНрд╕ рд╣реИрдВред рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ:


рднреМрддрд┐рдХреАрдХрд░рдг


рд╕рд╛рдордЧреНрд░реАрдХрд░рдг (рдкреБрдирд░реАрдХреНрд╖рдг) рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╕рдВрдХрд▓рдХ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред тИ╖ 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 рдЗрд╕рд▓рд┐рдП, "рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрджреНрдзрд░рдг" рдХреЗ рд▓рд┐рдП, рдЗрди рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рджреЛ рдПрдХрд▓ рдЙрджреНрдзрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
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] --    [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 рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреГрд╖реНрда рдкрд░ рджреЗрдЦрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдк рдЕрдиреНрдп рд▓реЗрдЦреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдФрд░ рдХрдИ рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/In133009/


All Articles