рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд▓рд┐рдВрдХреНрдб рд╕реВрдЪреА

рдХреНрд▓реЛрдЬрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдирд┐рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╣рд╛рд╕реНрдХреЗрд▓: x:xs рд╕рдорд╛рди рдПрдХ рдЕрдВрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ x рд╕реВрдЪреА ( head ) рдХреА рд╢реБрд░реБрдЖрдд рд╣реИ, xs рдирд┐рд░рдВрддрд░рддрд╛ ( tail ) рд╣реИред



рдореИрдВрдиреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ред

рдПрдХ рд╕реВрдЪреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг


рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореВрд▓ рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: nil - рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА, prepend ( cons ) - рд╕реВрдЪреА, head рдФрд░ tail рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕рдореНрдорд┐рд▓рд┐рдд рдлрд╝рдВрдХреНрд╢рдиред

рджреЛ рдорджреЛрдВ рдХреА рд╕реВрдЪреА рдмрдирд╛рдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 prepend('a', prepend('b', nil)) // 'a' -> 'b' -> nil 

prepend рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

 function prepend(x, xs) { return function (select) { return select(x, xs) } } 

рдореБрдлреНрдд рдЪрд░ ( x:xs ) рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП select рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╡рд╛рдВрдЫрд┐рдд select рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рд╕реВрдЪреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП head рдФрд░ tail рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрдмрд▓рддрд╛ рд╣реИ:

 function select_head(x, xs) { return x } function select_tail(x, xs) { return xs } function head(a) { return a(select_head) } function tail(a) { return a(select_tail) } 

рдпрд╣ рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА ( nil ) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ:

 function nil() { return nil } 

рддреЛ head(nil) === tail(nil) === nil ред

рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдПрдХ рд╕реВрдЪреА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо:

 var a = prepend('a', prepend('b', nil)) // 'a' -> 'b' -> nil head(a) // => 'a' head(tail(a)) // => 'b' head(tail(tail(a))) // => nil while (a !== nil) { console.log(head(a)) a = tail(a) } 

рдЙрдЪреНрдЪ рдЖрджреЗрд╢ рдХрд╛рд░реНрдп


рдкрд░рд┐рдгрд╛рдореА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП, рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, map :

 function map(fn, a) { if (a === nil) return nil return prepend(fn(head(a)), map(fn, tail(a))) } 

рдпрд╣ рд╣рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рд╣рдорд╛рд░реА рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:

 var a = prepend(1, prepend(2, prepend(3, nil))) // 1 -> 2 -> 3 -> nil function power_of_2(x) { return 1 << x } var b = map(power_of_2, a) // 2 -> 4 -> 8 -> nil 

рдЕрдиреНрдп рдЬреБрдбрд╝реЗ рдХрд╛рд░реНрдпреЛрдВ ( filter , reduce ) рдХреЛ рд╣реЛрдорд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рдардХ рдХреЛ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдРрд╕реА рдмрд╛рддреЗрдВ тДв


рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрддреЗ рд╕рдордп, рдПрдХ рднреА рд╕рд░рдгреА рдХреНрд╖рддрд┐рдЧреНрд░рд╕реНрдд рдирд╣реАрдВ рд╣реБрдИ рдереАред

рд░реЛрдЯреА рд╕реЗ рдПрдХ рдЯреНрд░реЙрд▓реА рдХреА рддрд╕реНрд╡реАрд░ рдХреА рдЖрд╢рдВрдХрд╛ : рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд▓рд╛рдЧреВ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХрд╛рдо рдХреЗ рд▓рд┐рдП, рд╡реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рдЕрдирд░реНрдЧрд▓ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рдХреЛ рдлрд╛рдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЬреНрдЮрд╛рди рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред

рдЬреАрдереБрдм: github.com/mvasilkov/functional-js

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


All Articles