рдХреНрд▓реЛрдЬрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдирд┐рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╣рд╛рд╕реНрдХреЗрд▓:
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