рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рдкрд░рд┐рдЪрдпред рднрд╛рдЧ 2. рдХреЛрдб рдЙрдкрдХрд░рдг рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддреЗ рд╣реБрдП

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


рдкреНрд░рд╢рд╕реНрддрд┐ рдкрддреНрд░ рдореЛрдирд╛рдб


рдЪреВрдБрдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ 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 рд╡реИрд▓реНрдпреВ рдПрдХ рдЕрдореВрд░реНрдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓реА рдФрд░ рдЙрдмрд╛рдК рдХрд╛рдо рд╣реИред рд▓реЗрдХрд┐рди рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдРрд╕реЗ рдХреЛрд╖реНрдардХ рдЙрджреНрдзреГрдд рдХрд┐рдП рдЧрдП рд╣реИрдВ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛрдб рдХреЛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВред
рд╡реЗ рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ:

рддрджрдиреБрд╕рд╛рд░, рдмреНрд░реИрдХреЗрдЯ рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рд╣реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ / рдШреЛрд╖рдгрд╛ / рдкреНрд░рдХрд╛рд░ / рдкреИрдЯрд░реНрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрджреНрдзрд░рдг [| ╬╗ _ тЖТ 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 тЖТ тАж |] | рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджреНрдзрд░рдг рдФрд░ рд▓реЗрдмрд▓ рдХрд╛ рдШреЛрдВрд╕рд▓рд╛ рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╡реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ - рдЖрдк рдЙрджреНрдзрд░рдг рдХреЗ рдЕрдВрджрд░ рдФрд░ рдкреЗрд╕реНрдЯ рдХреЗ рдЕрдВрджрд░ рдЙрджреНрдзрд░рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ "рдЕрд░реНрдз-рдЙрджреНрдзрд░рдг" рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХреА рдХреБрдЫ рд╕реАрдорд╛рдПрдБ рд╣реИрдВ: рдПрдХ рдЪрд░ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдирд╛ рдЙрд╕ рдорд╛рди рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛрддреА рд╣реИ рдЬреЛ рддрдм рддрдХ рдЙрдкрд▓рдмреНрдз рдЧреБрдВрдЬрд╛рдЗрд╢ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред рдЗрд╕ рдирд┐рдпрдо рдХреЗ рддреАрди рдорд╛рдорд▓реЗ рд╣реИрдВ:
  1. рдХреЛрд╖реНрдардХ рдХреЛ рдЙрджреНрдзреГрдд рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╕реЗ рджреВрд╕рд░реЗ рдЙрджреНрдзрд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ "рдХреИрдкреНрдЪрд░" рдкрд░ рд░реЛрдХ рд▓рдЧрд╛рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдПрдХ рдирд┐рдпрдорд┐рдд рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд╣рд░ рдХреНрд▓реЛрдЬрд░ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдпрд╣ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкреВрд░реНрд╡реЛрдХреНрдд рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдПрдХреАрдХрд░рдг рдХреЗ рдХрд╛рд░рдг рд╣реИред рдЙрджреНрдзрд░рдг рдХреЗрд╡рд▓ [p| тАж |] [p| тАж |] рдЙрди рдЪрд░ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ рдЬреЛ рдЙрддреНрдкрдиреНрди рдкреИрдЯрд░реНрди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ (рдЪреВрдВрдХрд┐ рдпреЗ рдЪрд░ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╣реЛрдВрдЧреЗ рдФрд░ рдпрджрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдирдП рдордирдорд╛рдиреЗ рдирд╛рдо рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдП) ред
  2. рдХреЛрдЯреЗрд╢рди рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рд╡реИрд╢реНрд╡рд┐рдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдЬрд╣рд╛рдВ рдЙрджреНрдзрд░рдг рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдлрд┐рд░ рд╕реЗ, рд╕рд╛рдорд╛рдиреНрдп рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрджреНрдзрд░рдг рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдирдХреА рдЗрди рд╕рднреА рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдорд╛рди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдирдХреА рдЕрдкрдиреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВред рдпрд╣ рдирд┐рдпрдо рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдкреНрд░рддреАрдХ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рдЬреАрдПрдЪрд╕реА рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдпреЛрдЧреНрдп рдмрдирд╛рддрд╛ рд╣реИ) ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрджреНрдзрд░рдг [| map |] [| map |] рдХреЛ " GHC.Base.map " рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ [t| [String] тЖТ Bool |] [t| [String] тЖТ Bool |] рдХреЛ " [GHC.Base.String] тЖТ GHC.Bool.Bool " [t| [String] тЖТ Bool |] рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЪрд┐рдкрдХрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рдЙрдирдХреЗ рд▓рд┐рдП $(dyn "тАж") рд░реИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдЧрд▓рддреА рд╕реЗ рдХрд┐рд╕реА рдФрд░ рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рдВрдШрд░реНрд╖ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛ рдпрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЙрд╕ рдХреЛрдб рдХреЛ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП dyn рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИред
  3. рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрд╖реНрдардХ рдХреЗ рдЙрджреНрдзрд░рдг рдХреЗ рдЕрдВрджрд░, рдЖрдк рд╕реНрдерд╛рдиреАрдп рдлрд╝рдВрдХреНрд╢рди рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрдХрд▓рди рдХреЗ рдЪрд░рдг рдореЗрдВ, рдпреЗ рдЪрд░ (рдмрд╕ рд╕рдВрдмрдВрдзрд┐рдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛) рд╣реИрдВ, рд▓реЗрдХрд┐рди рд░рдирдЯрд╛рдЗрдо рдкрд░, рд╡реЗ рд╕рд┐рд░реНрдл рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП 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 рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

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


All Articles