Функции как данные. Замыкание

Ноябрь 25, 2006, 01:21

Было это в са­мом-са­мом на­ча­ле мо­е­го изу­че­ния функ­ци­о­наль­ных язы­ков. Чи­тая SICP (рус­ский пе­ре­вод) я по­нял что та­кое за­мы­ка­ние :) . По­про­бую это опи­сать. За­мы­ка­ние кон­тек­ста - спо­соб­ность лямб­да функ­ции со­хра­нять кон­текст, в ко­то­ром она была опре­де­ле­на. Это свой­ство лямб­да функ­ций мож­но ис­поль­зо­вать для хра­не­ния дан­ных, т.е. неко­то­рые дан­ные мож­но хра­нить в виде функ­ций. Из­вле­кать эти дан­ные мож­но с по­мо­щью дру­гих функ­ций. По­про­бу­ем разо­брать­ся (на при­ме­ре хра­не­ние пары):

pair a b = \fnc -> fnc a b
first p = p (\a b -> a)
second p = p (\a b -> b)

Итак, опре­де­ля­ем пару как лямб­да функ­цию от од­но­го ар­гу­мен­та (этим ар­гу­мен­том впо­след­ствии бу­дет дру­гая функ­ция), этот ар­гу­мент при­ме­ня­ет­ся к чле­нам пары. Функ­ция по­лу­че­ния пер­во­го чле­на пары бу­дет функ­ци­ей од­но­го ар­гу­мен­та, ко­то­рая бу­дет при­ме­нять этот ар­гу­мент к лямб­да функ­ции двух ар­гу­мен­тов

\a b -> a

Функ­ция по­лу­че­ния вто­ро­го чле­на пары опре­де­ля­ет­ся ана­ло­гич­но.

Те­перь мы мо­жем опре­де­лить пару

some_pair = pair 1 2

И про­ве­рить как ра­бо­та­ют функ­ции first и sec­ond

> first some_pair
1
> second some_pair
2

Итак, мно­го-мно­го ма­ло­по­нят­но­го тек­ста на рус­ском, и все­го три про­стые строч­ки на Haskell’е :)

Сергей Лымарь © 2005-2014, Все права защищены.