
рд╕реЗрд░реЛрдХреЗрд▓ рдореЗрдВ, рд╣рдо рди рдХреЗрд╡рд▓ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд▓рдЧреЗ рд╣реБрдП рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдмреЗрд╣рддрд░ рдХреЗ рд▓рд┐рдП рджреБрдирд┐рдпрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рднреА рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рднреА рд╣рд╛рд╕реНрдХреЗрд▓рд┐рд╕реНрдЯ - рдЧреНрд▓рд╛рд╕рдЧреЛ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрдВрдкрд╛рдЗрд▓рд░ (рдЬреАрдПрдЪрд╕реА) рдХреЗ рдореБрдЦреНрдп рдЙрдкрдХрд░рдг рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рдордиреЗ рд░рд┐рдЪрд░реНрдб рдПрд╕реЗрдирдмрд░реНрдЧ рдХреЗ рдХрд╛рдо рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рддрд╣рдд рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛, "рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░: рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рдЕрднреНрдпрд╛рд╕ ред "
рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдореЗрдВ, рд╡реНрд▓рд╛рджрд┐рд╕реНрд▓рд╛рд╡ рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдкрд░ рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдореА рдХреНрдпреЛрдВ рд╣реИ рдФрд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдордиреЗ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рд░реВрд╕реА рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рддрд╛рдХрд┐ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдПрдХ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдПрдХ рдФрд░ рдпреЛрдЧрджрд╛рди рдХрд░ рд╕рдХреЗрдВред
рдорд╛рдорд▓реЛрдВ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐

рдЖрд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рд╡реЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реВрдВред рдЖрдЗрдП рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпреЛрдВред рдХреЛрдб рд╕реЗ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
- рдкреНрд░рджрд░реНрд╢рди, рдЕрд░реНрдерд╛рддреН, рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рдФрд░ рдХрдо рдореЗрдореЛрд░реА рдЦрдкрдд;
- рд╕реНрдерд┐рд░рддрд╛ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА;
- рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд╢реБрджреНрдзрддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреАред
рдореМрдЬреВрджрд╛ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, рд╕рднреА рддреАрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдо рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд╛рд╕реНрдХреЗрд▓ рдкрд░ рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде, рдХрд╛рд░реНрдп рд╕рд░рд▓ рд╣реИред
рд╣рд╛рд╕реНрдХреЗрд▓ рдорд╛рдирдХ: рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ + рдкреНрд░рджрд░реНрд╢рди
рд╣рд╛рд╕реНрдХреЗрд▓ рдПрдХ рд╕рд░рд▓ рдкреНрд░рдгрд╛рд▓реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ: рдЖрд▓рд╕реА рдЧрдгрдирд╛, рдмреАрдЬреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╣реБрд░реВрдкреА рд▓реИрдореНрдмреНрдбрд╛ рдкрдерд░реАред рдпрд╣ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрди рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг, рд╕рдорд░реНрдерд┐рдд рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЙрддреНрдкрд╛рджрдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рджрд╛рд╡реЗ рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рддреБрд▓рдирд╛ рдЕрдзрд┐рдХ рд▓реЛрдХрдкреНрд░рд┐рдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдХрд░рддреЗ рд╣реИрдВред
рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдореЗрдореЛрд░реА рдореЗрдореЛрд░реА рд╡рд╛рд▓реА рднрд╛рд╖рд╛рдПрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╕реА, рд╕рдмрд╕реЗ рдЧрдВрднреАрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрдлрд░ рдУрд╡рд░рдлреНрд▓реЛ, рдореЗрдореЛрд░реА рд▓реАрдХ)ред рдХрднреА-рдХрднреА рдРрд╕реА рднрд╛рд╖рд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЗрд╕рд▓рд┐рдПред
рд╕реБрд░рдХреНрд╖рд┐рдд рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рд▓реИрдВрдЧреНрд╡реЗрдЬ рджреЛ рд╕рдореВрд╣ рдмрдирд╛рддреА рд╣реИрдВ: рд╡реЗ рдЬреЛ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╛рд╣рдХ рдФрд░ рдЬрдВрдЧ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдмрд┐рдирд╛ рдореЗрдореЛрд░реА рддрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╣реБрдВрдЪ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдиреЗ рдореЗрдВ рдЬрдВрдЧ рдЕрджреНрд╡рд┐рддреАрдп рд▓рдЧрддреА рд╣реИред рдЗрд╕ рд╕рдореВрд╣ рдореЗрдВ рдЕрдм рдЪрдХреНрд░рд╡рд╛рдд рдФрд░ рдЕрдиреНрдп рд╢реЛрдз рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд╡рд┐рдкрд░реАрдд, рд░рд╕реНрдЯ рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХреЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рд╣реИред рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд░рд╕реНрдЯ рдХрд╛ рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди рдЧреИрд░-рддреБрдЪреНрдЫ рдФрд░ рдореИрдиреБрдЕрд▓ рд╣реИред рдЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЬреЛ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╡рд╣рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд╕рдордп рдмрд┐рддрд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред
рдХрдЪрд░рд╛ рдмреАрдирдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рдкрд╛рд╕ рднрд╛рд╖рд╛рдПрдВ рдмрдЪреА рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЖрдЧреЗ рдЙрдирдХреА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рджреЛ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗред
рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ (рдпрд╛ рдмрд▓реНрдХрд┐ рдореЛрдиреЛрдЯрд╛рдЗрдкреНрдб ) рднрд╛рд╖рд╛рдПрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╛ рдХреНрд▓реЛрдЬрд░, рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдХреА рд╢реБрджреНрдзрддрд╛ рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд╛ рд╕рдорд╛рди рд╕реНрддрд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА (рдФрд░ рдирд╣реАрдВ, рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЖрдкрдХреЛ рджреЛрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ) !)ред
рдЬрд╛рд╡рд╛ рдпрд╛ рдЧреЛ рдЬреИрд╕реА рд╡реИрдзрд╛рдирд┐рдХ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЕрдХреНрд╕рд░ рдмрд╣реБрдд рд╕реАрдорд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рд╣реЛрддреА рд╣реИред рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЛ рдирд┐рд░рд░реНрдердХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдФрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреЛ рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдХрдореА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рдХреЗ рдЙрдкрдпреЛрдЧ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдврд▓рд╛рдИ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рддреА рд╣реИ ред рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ (рдЗрдирдкреБрдЯ, рдЖрдЙрдЯрдкреБрдЯ) рдФрд░ рд╢реБрджреНрдз рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рдЧрдгрдирд╛ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЕрд▓рдЧрд╛рд╡ рдирд╣реАрдВ рд╣реИред
рдЕрдВрдд рдореЗрдВ, рд╕реБрд░рдХреНрд╖рд┐рдд рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдХреЗ рд╕рд╛рде рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ, рдПрдХ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдФрд░ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА, рд╣рд╛рд╕реНрдХреЗрд▓ рдЖрд▓рд╕реНрдп рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рдЦрдбрд╝рд╛ рд╣реИред рдЖрд▓рд╕реА рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХрдВрдкреЛрдЬрд╝реЗрдмрд▓, рдореЙрдбреНрдпреВрд▓рд░ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рд╣реИред рд╡реЗ рд╕рд╣рд╛рдпрдХ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдХрд┐рд╕реА рднреА рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рд╡рд┐рдШрдЯрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рд░реНрдорд╛рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рд╣рд╛рд╕реНрдХреЗрд▓ рд▓рдЧрднрдЧ рдПрдХ рд╕рд╣реА рднрд╛рд╖рд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдЬрдм рддрдХ рдЖрдкрдХреЛ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдЬрдбрд╛ рдЬреИрд╕реЗ рдкреНрд░рдореЗрдп рдкреНрд░реВрдл рд╕рд╛рдзрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдереИрддрд┐рдХ рд╕рддреНрдпрд╛рдкрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдкрдиреА рдкреВрд░реА рдХреНрд╖рдорддрд╛ рд╕реЗ рджреВрд░ рд╣реИред
рдЬрд╣рд╛рдВ рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдкрд░реНрдпрд╛рдкреНрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рдЙрд╕рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, Prelude
(рдпрд╛ рдПрдХ primitive
рдкреИрдХреЗрдЬ рд╕реЗ рдПрдХ рд╕рд░рдгреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛) рд╕реЗ рд╕реВрдЪреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
(!!) :: [a] -> Int -> a indexArray :: Array a -> Int -> a
рдЗрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдХреБрдЫ рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХреА рд▓рдВрдмрд╛рдИ рд╕реЗ рдХрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрдЪреНрдЪ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рд╡рд╛рд▓реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред
рдПрдЬрдбрд╛: рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ + рд╢реБрджреНрдзрддрд╛
рдкреНрд░рдореЗрдпреЛрдВ рдХреЗ рдкреНрд░рдорд╛рдг рдХреЗ рд╕рд╛рдзрди (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдХ ) рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЙрдкрдХрд░рдг рд╣реИрдВ рдЬреЛ рдЧрдгрд┐рддреАрдп рдкреНрд░рдореЗрдпреЛрдВ рдХреЗ рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рдорд╛рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкреНрдпреВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдПрдХ рдЧрдгрд┐рддрдЬреНрдЮ рдХреЗ рд▓рд┐рдП, рдРрд╕реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдЧрдЬ рдкрд░ рд╕рдмреВрдд рд▓рд┐рдЦрдиреЗ рдЬреИрд╕рд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд╛рдХреНрд╖реНрдп рдХреА рд╡реИрдзрддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкреНрдпреВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрднреВрддрдкреВрд░реНрд╡ рдХрдареЛрд░рддрд╛ рдореЗрдВ рдЕрдВрддрд░ред
рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рдореЗрдпреЛрдВ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рд╛рдзрди рдПрдХ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА (рдФрд░ рд╕рдВрднрд╡рддрдГ рдПрдХ рдПрдХреАрдХреГрдд рд╡рд┐рдХрд╛рд╕ рд╡рд╛рддрд╛рд╡рд░рдг) рдХреЗ рд╕рд╛рде рдЧреВрдврд╝ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рд╕реЗ рдЗрддрдирд╛ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдФрд╕рдд рджрд░реНрдЬреЗ (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдиреБрдкрд╕реНрдерд┐рдд) рдмрд╛рдХреА рд╕рдм рдХреБрдЫред рдкреНрд░рдореЗрдп рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдзрди, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд▓реЗрдЦрдХреЛрдВ рдиреЗ рдЕрдкрдирд╛ рд╕рд╛рд░рд╛ рд╕рдордп рдПрдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдмрд┐рддрд╛рдпрд╛ рдФрд░ рдпрд╣ рднреВрд▓ рдЧрдП рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдЕрднреА рднреА рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╕рддреНрдпрд╛рдкрд┐рдд рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рдкреЛрд╖рд┐рдд рд╕рдкрдирд╛ рдкреНрд░рдореЗрдпреЛрдВ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдзрди рд╣реИ, рдЬреЛ рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдЪреНрдЫреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╣реЛрдЧреАред рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдЗрджрд░реАрд╕ рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдиреЗ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдЦреНрдд (рдКрд░реНрдЬрд╛рд╡рд╛рди) рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рднрд╛рд╖рд╛ рд╣реИ, рдФрд░ рдлрд┐рд▓рд╣рд╛рд▓ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИред
рдкреНрд░рдореЗрдпреЛрдВ рдХреЛ рд╕рд┐рджреНрдз рдХрд░рдиреЗ рдХреЗ рд╕рднреА рд╕рд╛рдзрдиреЛрдВ рдореЗрдВ, рдПрдЬрдбрд╛ рд╣рд╛рд╕реНрдХреЗрд▓рд┐рд╕реНрдЯ рд╕рднреА рдХреЛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдХрдИ рдорд╛рдпрдиреЛрдВ рдореЗрдВ, рдпрд╣ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рдеред рд╣рдо рд╕реЗрд░реЛрдХреЗрд▓ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЧреБрдгреЛрдВ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░реА рд╕рд╣рдпреЛрдЧреА рдбрд╛рдирд┐рдпрд╛ рд░реЛрдЧреЛрдЬрд┐рди рдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рд▓реЗрдЦ рд▓рд┐рдЦреЗ ред
рдпрд╣рд╛рдБ рд╣рд╛рд╕реНрдХреЗрд▓ рдСрдкрд░реЗрдЯрд░ (!!)
рд╕рдорд╛рди рдПрдХ рд▓реБрдХрдЕрдк рдлрдВрдХреНрд╢рди рдЯрд╛рдЗрдк рд╣реИ:
lookup : тИА (xs : List A) тЖТ Fin (length xs) тЖТ A
рдпрд╣рд╛рдВ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЯрд╛рдЗрдк List A
, рдЬреЛ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ [a]
рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдЗрд╕реЗ рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдо xs
рджреЗрддреЗ рд╣реИрдВред рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рд╢рдмреНрдж рд╕реНрддрд░ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХреЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ:
(!!) :: [a] -> Int -> a
рд▓реЗрдХрд┐рди Agda рдореЗрдВ, рд╣рдо рдЗрд╕ xs
рдорд╛рди рдХреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдо рджреВрд╕рд░реЗ lookup
рдкреИрд░рд╛рдореАрдЯрд░, Fin (length xs)
ред рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдЕрдкрдиреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ рдПрдХ рдирд┐рд░реНрднрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред
lookup
рдореЗрдВ рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ n ~ length xs
рд▓рд┐рдП Fin n
рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред Fin n
рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рд░реЗрдВрдЬ [0, n)
рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП Fin (length xs)
рдПрдХ рдЧреИрд░-рдЛрдгрд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬреЛ рдЗрдирдкреБрдЯ рд╕реВрдЪреА рдХреА рд▓рдВрдмрд╛рдИ рд╕реЗ рдХрдо рд╣реИред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдХрд┐рд╕реА рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЗ рд╡реИрдз рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЛрдЯреЗ рддреМрд░ рдкрд░, lookup ["x","y","z"] 2
рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди lookup ["x","y","z"] 42
рдлреЗрд▓ рд╣реЛрдЧрд╛ред
рдЬрдм рдпрд╣ рдПрдЬрдбрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рд╣рдо MAlonzo рдмреИрдХрдПрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЕрд╕рдВрддреЛрд╖рдЬрдирдХ рд╣реЛрдЧрд╛ред рдпрд╣ MAlonzo рдХреА рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИ: рдЙрд╕реЗ рдХрдИ unsafeCoerce
рд╕рдореНрдорд┐рд▓рд┐рдд unsafeCoerce
рддрд╛рдХрд┐ GHC рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Agda рджреНрд╡рд╛рд░рд╛ рд╕рддреНрдпрд╛рдкрд┐рдд unsafeCoerce
ред рд▓реЗрдХрд┐рди рд╡рд╣реА unsafeCoerce
рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ (рдЗрд╕ рд▓реЗрдЦ рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рдж, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдЕрдиреНрдп рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ - рд▓реЗрдЦрдХ рдХрд╛ рдиреЛрдЯ) ред
рдпрд╣ рд╣рдореЗрдВ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИ: рд╣рдореЗрдВ рдореЙрдбрд▓рд┐рдВрдЧ рдФрд░ рдФрдкрдЪрд╛рд░рд┐рдХ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдПрдЬрдбрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рд╣рд╛рд╕реНрдХреЗрд▓ рдкрд░ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╡рд░реНрдХрдлрд╝реНрд▓реЛрдЬрд╝ рдХреЗ рдЗрд╕ рд╕рдВрдЧрдарди рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░рд╛ рдПрдЬрдбрд╛ рдХреЛрдб рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░-рд╕рддреНрдпрд╛рдкрд┐рдд рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рд╛рдХреГрддрд┐рдХ рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрджрд░реНрд╢ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред рд▓рдХреНрд╖реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рд╣реИ, рддреЛ рдпрд╣ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рд╣рд╛рд╕реНрдХреЗрд▓: рд╕реБрдзрд╛рд░ + рдкреНрд░рджрд░реНрд╢рди

рдЖрд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рднрд╛рд╖рд╛рдУрдВ рдХреА рд╕реНрдерд┐рд░ рдЧрд╛рд░рдВрдЯреА рдХреЗ рд▓рд┐рдП, GHC рдиреЗ рдПрдХ рд▓рдВрдмрд╛ рд╕рдлрд░ рддрдп рдХрд┐рдпрд╛ рд╣реИред рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЬреЛрдбрд╝реЗ рдЧрдП рдереЗред рдореИрдВрдиреЗ Haskell рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрдм GHC 7.4 рд╕рдВрдХрд▓рдХ рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдерд╛ред рдлрд┐рд░ рднреА, рдЗрд╕рдХреЗ рдкрд╛рд╕ рдЙрдиреНрдирдд рдкреНрд░рдХрд╛рд░-рд╕реНрддрд░реАрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдереЗ: RankNTypes
, GADTs
, TypeFamilies
, DataKinds
рдФрд░ PolyKinds
ред
рдлрд┐рд░ рднреА, рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЕрднреА рднреА рдкреВрд░реНрдг-рдирд┐рд░реНрднрд░ рдЖрд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ: рди рддреЛ рдЖрд╢реНрд░рд┐рдд рдХрд╛рд░реНрдп (╬а-type) рдФрд░ рди рд╣реА рдЖрд╢реНрд░рд┐рдд рдЬреЛрдбрд╝реЗ (dependent-types)ред рджреВрд╕рд░реА рдУрд░, рдХрдо рд╕реЗ рдХрдо рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╣реИ!
рд╡рд░реНрддрдорд╛рди рдЕрднреНрдпрд╛рд╕ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
- рдирд┐рдЬреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдиреНрдХреЛрдб рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░,
- рдЕрд╕рдВрддреГрдкреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ,
- рдПрдХрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢рдмреНрджреЛрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдХреА рдЦрд╛рдИ рдХреЛ рдкрд╛рдЯреЗрдВ
рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЛрдб рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди singletons
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреА рдкреАрдврд╝реА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред

рддреЛ рд╕рдмрд╕реЗ рд╕рд╛рд╣рд╕реА рдФрд░ рдирд┐рд░реНрдгрд╛рдпрдХ рдЕрдм рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣рд╛рдБ Agda рдкрд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рдорд╛рди lookup
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
{-# OPTIONS -Wall -Wno-unticked-promoted-constructors -Wno-missing-signatures #-} {-# LANGUAGE LambdaCase, DataKinds, PolyKinds, TypeFamilies, GADTs, ScopedTypeVariables, EmptyCase, UndecidableInstances, TypeSynonymInstances, FlexibleInstances, TypeApplications, TemplateHaskell #-} module ListLookup where import Data.Singletons.TH import Data.Singletons.Prelude singletons [d| data N = Z | SN len :: [a] -> N len [] = Z len (_:xs) = S (len xs) |] data Fin n where FZ :: Fin (S n) FS :: Fin n -> Fin (S n) lookupS :: SingKind a => SList (xs :: [a]) -> Fin (Len xs) -> Demote a lookupS SNil = \case{} lookupS (SCons x xs) = \case FZ -> fromSing x FS i' -> lookupS xs i'
рдФрд░ рдпрд╣рд╛рдБ GHCi рд╕рддреНрд░ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд▓реБрдХрдЕрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмрд╣реБрдд рдмрдбрд╝реЗ рд╣реИрдВ:
GHCi, version 8.6.2: http://www.haskell.org/ghc/ :? for help [1 of 1] Compiling ListLookup ( ListLookup.hs, interpreted ) Ok, one module loaded. *ListLookup> :set -XTypeApplications -XDataKinds *ListLookup> lookupS (sing @["x", "y", "z"]) FZ "x" *ListLookup> lookupS (sing @["x", "y", "z"]) (FS FZ) "y" *ListLookup> lookupS (sing @["x", "y", "z"]) (FS (FS FZ)) "z" *ListLookup> lookupS (sing @["x", "y", "z"]) (FS (FS (FS FZ))) <interactive>:5:34: error: тАв Couldn't match type ''S n0' with ''Z' Expected type: Fin (Len '["x", "y", "z"]) Actual type: Fin ('S ('S ('S ('S n0)))) тАв In the second argument of 'lookupS', namely '(FS (FS (FS FZ)))' In the expression: lookupS (sing @["x", "y", "z"]) (FS (FS (FS FZ))) In an equation for 'it': it = lookupS (sing @["x", "y", "z"]) (FS (FS (FS FZ)))
рдпрд╣ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдХрд╛ рдорддрд▓рдм рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ lookupS
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рднрд╛рд╖рд╛ рдХреНрд╖рдорддрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдореИрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВ рдЬреЛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рдЕрдиреБрд╕рдВрдзрд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдмрд╛рд╣рд░, рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдХреЛрдб рд╢реИрд▓реА рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред
рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд▓рдВрдмрд╛рдИ-рдЕрдиреБрдХреНрд░рдорд┐рдд рд╡реИрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдо рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, Agda рд╕реЗ рдкреНрд░рддреНрдпрдХреНрд╖ рдХреЛрдб рдЕрдиреБрд╡рд╛рдж рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рдкреНрд░рдХрдЯ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЕрдиреНрдп рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рдпрд╣рд╛рдБ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣реИрдВ:
- рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рд╕рдВрдмрдВрдз
a :: t
рдФрд░ рдкреНрд░рдкрддреНрд░ t :: k
рдХрд╛ рдЧрдВрддрд╡реНрдп рд╕рдВрдмрдВрдз t :: k
рдЕрд▓рдЧ рд╣реИрдВред 5 :: Integer
рд╢рдмреНрджреЛрдВ рдореЗрдВ рд╕рддреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдирд╣реАрдВред "hi" :: Symbol
рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рдмреНрджреЛрдВ рдореЗрдВ рдирд╣реАрдВред рдпрд╣ рд╡рд┐рдЪрд╛рд░реЛрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдореИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Demote
рдЯрд╛рдЗрдк Demote
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред - рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп
Int
рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реВрдЪреА рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддрд╛ рд╣реИ (рдФрд░ singletons
рдКрдВрдЪреЗ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ Nat
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)ред Int
рдФрд░ Nat
рдЧреИрд░-рдЖрдЧрдордирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХрд╛рддреНрдордХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╡реЗ Fin
рдпрд╛ lookupS
рдЬреИрд╕реЗ рдкреНрд░реЗрд░рдХ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рд╣рдо length
рдХреЛ len
рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред - рд╣рд╕реНрдХреЗрд▓ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕реНрддрд░ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИред
singletons
рдЙрдиреНрд╣реЗрдВ рдирд┐рдЬреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдХреЗ рдЖрдВрд╢рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреА рдХрдореА рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдЬрдЯрд┐рд▓ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдЙрджреНрдзрд░рдг рдореЗрдВ len
рдкрд░рд┐рднрд╛рд╖рд╛ len
рдереА, рддрд╛рдХрд┐ singletons
рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдХреЗ рд╕рдордХрдХреНрд╖, Len
рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред - рдХреЛрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЖрд╢реНрд░рд┐рдд рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИрдВред рд╢рдмреНрджреЛрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ рдкрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдХрд╛рдИ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪреА рдХреЗ рдмрдЬрд╛рдп, рд╣рдо
SList
рдХреЛ lookupS
рдЗрдирдкреБрдЯ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рдХрдИ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдУрд╡рд░рд╣реЗрдб рдХреА рдУрд░ рднреА рдЬрд╛рддрд╛ рд╣реИред рд╡реЗ рдпреВрдирд┐рдЯ рдкреНрд░рдХрд╛рд░реЛрдВ ( toSing
, fromSing
) рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдореВрд▓реНрдпреЛрдВ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдХрд╛рд░рдг рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ ( SingKind
рдкреНрд░рддрд┐рдмрдВрдз) рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рдХрд╛рд░рдгред
рдЕрд╕реБрд╡рд┐рдзрд╛ рдХрдо рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░, рдпреЗ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ 2016 рдореЗрдВ рд╕рдорд╕реНрдпрд╛ # 12564 рд╡рд╛рдкрд╕ рдХреА, рдФрд░ рдЙрд╕реА рд╡рд░реНрд╖ рдХреЗ # 12088 рднреА рд╣реИрдВред рджреЛрдиреЛрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ (рдЬреИрд╕реЗ рдЕрдиреБрдХреНрд░рдордг рд╕реВрдЪрд┐рдпреЛрдВ) рд╕реЗ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдмрд╛рдзрд╛ рдбрд╛рд▓рддреА рд╣реИрдВред рдпреЗ рдЬреАрдПрдЪрд╕реА рдХреАрдбрд╝реЗ рдЕрднреА рднреА рддрдп рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдирд╣реАрдВ рд╣реИред рдЬреАрдПрдЪрд╕реА рдкрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдХрдо рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рдЪреАрдЬреЗрдВ рдЖрд╕рдкрд╛рд╕ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИрдВред
рд╕рд╛рд░рд╛рдВрд╢
рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рд╣рдо рдХреЛрдб рд╕реЗ рд╕рднреА рддреАрди рдЧреБрдг рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИ:
рдЙрдЬреНрдЬрд╡рд▓ рднрд╡рд┐рд╖реНрдп
рдЙрдкрд▓рдмреНрдз рддреАрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреА рдЕрдкрдиреА рдХрдорд┐рдпрд╛рдВ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рдорд╛рдирдХ рд╣рд╛рд╕реНрдХреЗрд▓ рд▓реЗрдВ рдФрд░
singletons
рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХреЛрдбрд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рд╕реАрдзреЗ рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝реЗрдВред (рдЖрд╕рд╛рди рдХрд╛рдо рд╕реЗ рдХрд╣рд╛ред) - Agda рд▓реЗ рд▓реЛ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХреБрд╢рд▓ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдФрд░ RTS рд▓рд╛рдЧреВ рдХрд░реЗрдВред (рдЖрд╕рд╛рди рдХрд╛рдо рд╕реЗ рдХрд╣рд╛ред)
- рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рд╣рд╛рд╕реНрдХреЗрд▓ рд▓реЗрдВ, рдмрдЧ рдХреЛ рдареАрдХ рдХрд░реЗрдВ рдФрд░ рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдХреЛрдбрд┐рдВрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЬреЛрдбрд╝рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВред (рдЖрд╕рд╛рди рдХрд╛рдо рд╕реЗ рдХрд╣рд╛ред)
рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рддреАрди рд╡рд┐рдХрд▓реНрдк рдПрдХ рдмрд┐рдВрджреБ рдкрд░ (рдПрдХ рдЕрд░реНрде рдореЗрдВ) рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдорд╛рдирдХ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬреЛ рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЛрдб рдХреЗ рд╕рд╣реА рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЗ рдмрд┐рдирд╛ Agda рдХреЛрдб рдХреЛ рдЗрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд (рдЯреНрд░рд╛рдВрд╕рдкреЛрдЬрд╝реНрдб) рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рде рд╣рд╛рд╕реНрдХреЗрд▓ рдПрдХ рдЕрд░реНрде рдореЗрдВ, рдЗрд╕ рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рдЕрдзреВрд░рд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реИред рдХреБрдЫ рдХреЛ рд╕реБрдзрд╛рд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ, рд╣рдо рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред
рд╕рд┐рдВрдЧрд▓реЗрдЯреНрд╕ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛
рдкреНрд░рдЧрддрд┐ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрдХреЗрддрдХ singletons
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╕рд░рд▓реАрдХрд░рдг рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдФрд░ singletons
рдореЗрдВ рд▓рд╛рдЧреВ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдВрддрддрдГ, рдЗрд╕ рдкреИрдХреЗрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 2016 рдореЗрдВ, -XTypeInType
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ -XTypeInType
рдореИрдВрдиреЗ рдХреЗрдкреНрд░реЙрдХреНрд╕реА рдХреЛ SingKind
рдФрд░ SomeSing
рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ ред рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдорд┐рд▓рди рд╕реЗ рд╕рдВрднрд╡ рд╣реБрдЖред рдкреБрд░рд╛рдиреА рдФрд░ рдирдИ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ:
class (kparam ~ 'KProxy) => SingKind (kparam :: KProxy k) where type DemoteRep kparam :: * fromSing :: SingKind (a :: k) -> DemoteRep kparam toSing :: DemoteRep kparam -> SomeSing kparam type Demote (a :: k) = DemoteRep ('KProxy :: KProxy k) data SomeSing (kproxy :: KProxy k) where SomeSing :: Sing (a :: k) -> SomeSing ('KProxy :: KProxy k)
рдкреБрд░рд╛рдиреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, k
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡реНрдпреВ рдкреЛрдЬреАрд╢рди рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдлреЙрд░реНрдо t :: k
рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рджрд╛рдИрдВ рдУрд░ред рд╣рдо kparam :: KProxy k
рдЙрдкрдпреЛрдЧ kparam :: KProxy k
рдХреЛ k
рдХреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ k
рд▓рд┐рдПред
class SingKind k where type DemoteRep k :: * fromSing :: SingKind (a :: k) -> DemoteRep k toSing :: DemoteRep k -> SomeSing k type Demote (a :: k) = DemoteRep k data SomeSing k where SomeSing :: Sing (a :: k) -> SomeSing k
рдирдИ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, k
рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рджреГрд╢реНрдп рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрджреЛрдВ рдХреЗ рдмреАрдЪ рдЪрд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ KProxy
рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐, рдЬреАрдПрдЪрд╕реА 8.0 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╣реА рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реНрд░реЗрдгреА рдореЗрдВ рдЖрддреЗ рд╣реИрдВред
рдорд╛рдирдХ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рддреАрди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рджреБрдирд┐рдпрд╛ рд╣реИрдВ: рд╢рдмреНрдж, рдкреНрд░рдХрд╛рд░ рдФрд░ рд╡рд┐рдЪрд╛рд░ред рдпрджрд┐ рдЖрдк рдЬреАрдПрдЪрд╕реА 7.10 рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкрд╛рд░реНрд╕рд░ рдФрд░ рдПрдХ рдЕрд▓рдЧ рдЪреЗрдХ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЬреАрдПрдЪрд╕реА 8.0 рдЕрдм рдЙрдирдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИ: рдкреНрд░рдХрд╛рд░ рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд░ рдФрд░ рд╕рддреНрдпрд╛рдкрди рдЖрдо рд╣реИрдВред

рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рджреГрд╢реНрдп рдХреЗрд╡рд▓ рд╡рд╣ рднреВрдорд┐рдХрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдХрд╛рд░ рд╣реИ:
f :: T z -> ...
рдЬреАрдПрдЪрд╕реА 8.08.4 рдореЗрдВ, рдЕрднреА рднреА рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдирд╛рдо рд╕рдВрдХрд▓реНрдк рдХреЗ рдмреАрдЪ рдХреБрдЫ рдЕрдВрддрд░ рдереЗред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдЬреАрдПрдЪрд╕реА 8.6 рддрдХ рдЫреЛрдЯрд╛ рдХрд░ рджрд┐рдпрд╛: рдореИрдВрдиреЗ StarIsType
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рдпрд╛ рдФрд░ StarIsType
рдореЗрдВ PolyKinds
рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреЗрд╢ рдХреАред рдореИрдВрдиреЗ рд╢реЗрд╖ рдорддрднреЗрджреЛрдВ рдХреЛ рдЬреАрдПрдЪрд╕реА 8.8 рдХреЗ рд▓рд┐рдП рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ , рдФрд░ рдЬреАрдПрдЪрд╕реА 8.10 рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ ( рдЗрд╕ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореВрд▓ рд░реВрдк рдореЗрдВ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рднрд╡рд┐рд╖реНрдп рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рд▓реЗрдЦрдХ рдХрд╛ рдиреЛрдЯ )ред
рдЕрдЧрд▓рд╛ рдХрджрдо рдХреНрдпрд╛ рд╣реИ? рдЖрдЗрдП рдПрдХ рдирдЬрд╝рд░ SingKind
рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ SingKind
рдкрд░:
class SingKind k where type Demote k = (r :: Type) | r -> k fromSing :: Sing (a :: k) -> Demote k toSing :: Demote k -> SomeSing k
Demote
рдЯрд╛рдЗрдк Demote
рд▓рд┐рдП рдЯрд╛рдЗрдкрд┐рдВрдЧ рд░рд┐рд▓реЗрд╢рди рдХреЗ рдмреАрдЪ рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ Demote
рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ a :: t
рдФрд░ рдлреЙрд░реНрдо рдХрд╛ рдЧрдВрддрд╡реНрдп рд░рд┐рд╢реНрддрд╛ t :: k
ред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ (рдмреАрдЬреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП), Demote
рдПрдХ рдкрд╣рдЪрд╛рди рдорд╛рдирдЪрд┐рддреНрд░рдг рд╣реИ:
type Demote Bool = Bool
type Demote [a] = [Demote a]
type Demote (Either ab) = Either (Demote a) (Demote b)
рдЗрд╕рд▓рд┐рдП, Demote (Either [Bool] Bool) = Either [Bool] Bool
ред рдпрд╣ рдЕрд╡рд▓реЛрдХрди рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд░рд▓реАрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ:
class SingKind k where fromSing :: Sing (a :: k) -> k toSing :: k -> SomeSing k
рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ! рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рджреЛрдиреЛрдВ Either [Bool] Bool
рдФрд░ рдЕрдиреНрдп рдмреАрдЬреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдЧреИрд░-рдмреАрдЬреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ: Integer,
Natural
, Char
, Text
, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдпрджрд┐ рдкреНрд░рдЬрд╛рддрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡реЗ рдЖрдмрд╛рджреА рдирд╣реАрдВ рд╣реИрдВ: 1 :: Natural
рд╢рдмреНрджреЛрдВ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕реНрддрд░ рдкрд░ рдирд╣реАрдВред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рд╣рдо рдРрд╕реА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
type Demote Nat = Natural type Demote Symbol = Text
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд▓ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЛ рдЙрдард╛рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Text
рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдпрджрд┐ рд╣рдо ByteArray#
рдФрд░ Int#
рдХреЛ рдареАрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо Symbol
рдмрдЬрд╛рдп Text
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Natural
рдФрд░ рд╕рдВрднрд╡рддрдГ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ, рдЖрдк Demote
рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реИ рдирд╛?
рдХрд╛рд╢, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ред рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ, рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░: рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрдзреЗ рдЖрдБрдЦ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рд╢реЗрд╖ Demote
рдЙрджрд╛рд╣рд░рдг рднреА рд╣реИ:
type Demote (k1 ~> k2) = Demote k1 -> Demote k2 type a ~> b = TyFun ab -> Type data TyFun :: Type -> Type -> Type
~>
рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдирд┐рдЬреА-рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдФрд░ рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд┐рдВрдЧрд▓-рд▓реЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдПрдХрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб рд╣реЛрддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ ~>
рдФрд░ ->
, рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рдХрд╛ рдЕрд░реНрде рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░ (рдкреНрд░рдХрд╛рд░) рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ ->
рдкреНрд░рдХрд╛рд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдФрд░ ->
рджреГрд╢реНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЛрдВ рдХрд╛ рдорддрд▓рдм рд╣реИред рд╢рдмреНрдж рд╕реНрддрд░ рдкрд░, a
рд╕реЗ b
рддрдХ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдп a -> b
рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВред рдЯрд╛рдЗрдк рд╕реНрддрд░ рдкрд░, рдХреЗрд╡рд▓ a
рд╕реЗ b
рддрдХ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЯрд╛рдЗрдк a -> b
, рд▓реЗрдХрд┐рди рд╡реЗ рдЯрд╛рдЗрдк рдХреЗ рдкрд░реНрдпрд╛рдп рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рди рд╣реА рдЯрд╛рдЗрдк рдХреЗ рдкрд░рд┐рд╡рд╛рд░ред рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, GHC рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдХрд┐ f ~ g
рдФрд░ a ~ b
рдХрд╛ рдкрд╛рд▓рди fa ~ gb
, рдЬреЛ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ - рдЗрд╕реАрд▓рд┐рдП рдПрдХ рд╕реАрдорд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕реНрддрд░ рддрдХ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдкрд░ рд▓реЗ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдЗрд╕реЗ a :-> b
, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдЪ рд╣реЛрдЧрд╛ рдХрд┐ f ~ g
рдФрд░ a ~ b
follow from fa ~ gb
ред рдЕрдиреНрдп рдХрд╛рд░реНрдп рдЕрднреА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрдВрдЧреЗ a -> b
ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Just :: a :-> Maybe a
, рд▓реЗрдХрд┐рди Just :: a :-> Maybe a
рд╣реА рд╕рдордп рдореЗрдВ Just :: a :-> Maybe a
isJust :: Maybe a -> Bool
ред
рдЬрдм Demote
рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдВрддрд┐рдо рдХрджрдо рдЦреБрдж Sing
рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдирдП рдХреНрд╡рд╛рдВрдЯрд┐рдлрд╛рдпрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ forall
рдФрд░ ->
рдмреАрдЪ рдПрдХ рд╕рдВрдХрд░ рд╣реИред рдЖрдЗрдП рдЗрд╕рд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
isJust :: forall a. Maybe a -> Bool isJust = \x -> case x of Nothing -> False Just _ -> True
isJust
рдлрд╝рдВрдХреНрд╢рди isJust
a
рдФрд░ рдлрд┐рд░ рдорд╛рди x :: Maybe a
рд╕рд╛рде рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ a
x :: Maybe a
ред рдЗрди рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧреБрдг рд╣реИрдВ:
- рдореБрдЦрд░рддрд╛ред
isJust (Just "hello")
рдХреЙрд▓ рдореЗрдВ, рд╣рдо x = Just "hello"
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ a = String
рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ isJust (Just "hello")
рд░реВрдк рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрддрд╛ рд╣реИред рдЖрдзреБрдирд┐рдХ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рд╣рдо рджреЛрдиреЛрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЛ рднреА рдордЬрдмреВрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: isJust @String (Just "hello")
ред - рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ред рдХреЛрдб рдореЗрдВ
isJust
рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рджрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди рднреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: рд╣рдо case
рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдЯрд░реНрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╣реИрдВ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ Nothing
рдпрд╛ Just
ред рдЗрд╕рд▓рд┐рдП, рдорд╛рди рдХреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рдорд┐рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ: рдлрд╝рдВрдХреНрд╢рди Maybe Int
, Maybe String
, Maybe Bool
, рдЖрджрд┐ред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХрд┐рдЯреА рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред - рдирд┐рд░реНрднрд░рддрд╛ред
forall a. t
forall a. t
, рдЯрд╛рдЗрдк t
a
рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддрд╛ a
, рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд╛рд░рд┐рдд a
рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ a
ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, isJust @String
рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ Maybe String -> Bool
, рдФрд░ isJust @Int
рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ Maybe Int -> Bool
ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ forall
рдПрдХ рдЖрд╢реНрд░рд┐рдд рдорд╛рддреНрд░рд╛рддреНрдордХ рд╣реИред рдорд╛рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрдВрддрд░ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ: рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рд╣рдо рдХреЙрд▓ рдХрд░рддреЗ isJust Nothing
рдпрд╛ isJust (Just тАж)
, рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ рд╣рдореЗрд╢рд╛ Bool
ред рдЗрд╕рд▓рд┐рдП, ->
рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдХреНрд╡рд╛рдВрдЯрд┐рдлрд╛рдпрд░ рд╣реИред
Sing
рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдХреНрд╡рд╛рдВрдЯрд┐рдлрд╛рдпрд░ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ a -> b
, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ forall (a :: k). t
forall (a :: k). t
ред рдЗрд╕реЗ foreach (a :: k) -> t
рд░реВрдк рдореЗрдВ рдирд┐рд░реВрдкрд┐рдд рдХрд░реЗрдВред SingI
рдХреЛ рдмрд╛рд╣рд░ SingI
, рд╣рдо рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЖрд╢реНрд░рд┐рдд рдХреНрд╡рд╛рдВрдЯрд┐рдлрд╛рдпрд░, SingI
foreach (a :: k). t
рднреА рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ foreach (a :: k). t
foreach (a :: k). t
ред рдирддреАрдЬрддрди, singletons
рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рднрд╛рд╖рд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рд╣реИред
рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╣рд╛рд╕реНрдХреЗрд▓ рдкрд░ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирдЬрд╝рд░
рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ lookupS
рдХреНрд╡рд╛рдВрдЯрд┐рдлрд╛рдпрд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЙрджрдп рдХреЗ рд╕рд╛рде, рд╣рдо lookupS
рдХреЛ рдлрд┐рд░ рд╕реЗ lookupS
рд╕рдХрддреЗ рд╣реИрдВ:
data N = Z | SN len :: [a] -> N len [] = Z len (_:xs) = S (len xs) data Fin n where FZ :: Fin (S n) FS :: Fin n -> Fin (S n) lookupS :: foreach (xs :: [a]) -> Fin (len xs) -> a lookupS [] = \case{} lookupS (x:xs) = \case FZ -> x FS i' -> lookupS xs i'
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдХреЛрдб рдирд╣реАрдВ рдерд╛, рдлрд┐рд░ рднреА рдирд┐рд░рд░реНрдердХ рдХреЛрдб рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдореЗрдВ singletons
рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдереЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдирдпрд╛ рдХреЛрдб рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдЕрдм SingKind
, SList
, SNil
, fromSing
, fromSing
ред TemplateHaskell
рдХрд╛ рдХреЛрдИ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдо Len
рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рд╡рд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕реАрдзреЗ len
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рджрд░реНрд╢рди рднреА рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдЖрдкрдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рд╣рдореЗрдВ рдЕрднреА рднреА Int
рдмрдЬрд╛рдп рдПрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд N
рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП len
рд░реВрдк рдореЗрдВ length
рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реИред рд╢рд╛рдпрдж рд╣рд╛рд╕реНрдХреЗрд▓ рдкрд░ рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ Agda lookup
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдЗрдВрдбрд┐рд╡рд┐рдЬреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд N
рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдХреБрдЫ рдкрд╣рд▓реБрдУрдВ рдореЗрдВ, рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╣рд╛рд╕реНрдХреЗрд▓ рдорд╛рдирдХ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдФрд░ рднреА рд╕рд░рд▓ рд╣реИред рдлрд┐рд░ рднреА, рдЗрд╕рдореЗрдВ рд╢рдмреНрдж, рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рд╕рдорд╛рди, рдПрдХ рд╕рдорд╛рди рднрд╛рд╖рд╛ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдкреНрд░рдореБрдЦ рдШрдЯрдХреЛрдВ рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЛ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЗрд╕ рд╢реИрд▓реА рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдХрдИ рд╣рд╛рд╕реНрдХреЗрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдПрдХрд▓ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреА рд╣реИрдВред
рдпрд╣ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╣рдореЗрдВ рдЬреАрдПрдЪрд╕реА рдХреЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдИ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ: рдПрдХ рдкрд╛рд░реНрд╕рд░, рдирд╛рдо рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди, рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреЛрд░ рднрд╛рд╖рд╛ред рд╕рдм рдХреБрдЫ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдХреЛрд╢