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

рдореИрдВрдиреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ред
рдПрдХ рд╕реВрдЪреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг
рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореВрд▓ рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
nil - рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА,
prepend (
cons ) - рд╕реВрдЪреА,
head рдФрд░
tail рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕рдореНрдорд┐рд▓рд┐рдд рдлрд╝рдВрдХреНрд╢рдиред
рджреЛ рдорджреЛрдВ рдХреА рд╕реВрдЪреА рдмрдирд╛рдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
prepend('a', prepend('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))
рдЙрдЪреНрдЪ рдЖрджреЗрд╢ рдХрд╛рд░реНрдп
рдкрд░рд┐рдгрд╛рдореА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП, рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
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)))
рдЕрдиреНрдп рдЬреБрдбрд╝реЗ рдХрд╛рд░реНрдпреЛрдВ (
filter ,
reduce ) рдХреЛ рд╣реЛрдорд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рдардХ рдХреЛ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдРрд╕реА рдмрд╛рддреЗрдВ тДв
рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрддреЗ рд╕рдордп, рдПрдХ рднреА рд╕рд░рдгреА рдХреНрд╖рддрд┐рдЧреНрд░рд╕реНрдд рдирд╣реАрдВ рд╣реБрдИ рдереАред
рд░реЛрдЯреА рд╕реЗ рдПрдХ рдЯреНрд░реЙрд▓реА рдХреА
рддрд╕реНрд╡реАрд░ рдХреА рдЖрд╢рдВрдХрд╛
: рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд▓рд╛рдЧреВ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХрд╛рдо рдХреЗ рд▓рд┐рдП, рд╡реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рдЕрдирд░реНрдЧрд▓ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рдХреЛ рдлрд╛рдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЬреНрдЮрд╛рди рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред
рдЬреАрдереБрдм:
github.com/mvasilkov/functional-js