Мене много мъй срам (ламбда)

7 отговора 579 прегледа
#1

Мене много мъй срам (ламбда)

Здравейте ПП (пичове програмисти)
Дойдох пак замалко, да питам нещо.
Кажете на стария чиляк, какво е това
"ламбда" функция, за какво служи,
и къде се използува.

Поздрави: Любомир Ганов

Отговор
в отговор на Любoмиp Гaнoв #2

Ето йъ ламбдътъ!

Здрасти,

Ето какво знам аз, което се използва за
изчисляване на "атрибутите" на точка от визуализиращо устройство:

Pixel Attribute Calculation
Blending b = 0 if k = 0
b = (k + 1)/16, for k = 1, 2, ... , 15

Luminance Components
d0 = gamma[c0]
d1 = gamma[c1]
where c0 is the background color, c1 is the foreground color,
and gamma[] takes a color component from application space to CIE space.

Blended Luminance d = (1 - b) * d0 + b * d1

Blended Device Voltage c = lambda[d]
where lambda takes a color from CIE space to device color space.

(извини ме, мързи ме да ти го преведа на български или на друг език)

Отговор
в отговор на pyrx #3

Re: Ето йъ ламбдътъ!

Амиииии Пирксе не мисля че в случая става въпрос за атрибути, точки и визуализиращи устройства.

Ламбда-функциите са математическо понятие, което е основа на т.нар. функционално програмиране. Сигурно по-надолу ще наприказвам куп глупости, така че приканвам сериозния читател да посети Google и да търси примерно "lambda calculus introduction functional programming".

Та, глупостите, силно опростени и в частен случай, на някакъв измислен C-подобен език:

Ламбда-функцията е механизъм за създаване на анонимни функции.

Представи си че for_each в STL работеше като хората и можеше ако имаш една функция foo(x), която прави нещо с x, примерно го печата:

foo(x)
{
print(x);
}

да извикаш така:

for_each(vector_of_many_x, foo);

и това да извика foo(x) за всеки елемент на вектора.

Е, ако тази функция foo не ти трябва никъде другаде в програмата, що ти е да я дефинираш изобщо, да замърсяваш namespace-а с глупости и т.н.?
Представи си, че израза lambda(x, print(x)) връща функция, която има един аргумент и тялото й е print(този аргумент). Тогава би могъл да напишеш просто:

for_each(vector_of_many_x, lambda(x, print(x)).

Ако примерно print не е print, ами fprint, и иска още един аргумент, име на файл, може да направиш така:

for_each(vector_of_many_x, lambda(x, print("outputfile", x));

Ако ви е интересно, ходете да четете:

- най-популярно и приятно нещата са дадени примерно в документацията на Python, така на приложно ниво
- някоя дебела книга по функционално програмиране, например "Структура и интерпретация на компютърни програми"
- нещо за някой истински функционален език - шампионът по "истинскофункционалност" е Haskell, симпатичен език е и OCAML.
- истински лудите да ходят да видят как се реализират ламбда-функции на C++, в BLL (Boost Lambda Library). Забавно четиво е.

---
Bingo! Bongo! I don't want to leave the Kongo!
Отговор
в отговор на Skotowydec #4

Re: Ето йъ ламбдътъ!

И тук също има разни неща за четене:
[линк]

никога не е твърде рано да пропушиш
Отговор
в отговор на Skotowydec #5

Re: Ето йъ ламбдътъ!

OK, мерси за дългото писание.
Просто скоро ми се наложи да се боря с това, което казах и така се сетих за ламбдата на пиксела и рекох да кажа на човека да не е съвсем на сухо.

Отговор
в отговор на Skotowydec #6

Re: Ето йъ ламбдътъ!

Само не рабрах, къде е проблема със STL.

void print (int x)
{
// do something
}

std::vector<int> ar;

std::for_each (ar.begin (), ar.end (), print);


Това си бачка без проблем.

Отговор
в отговор на Hиkoлaй #7

Re: Ето йъ ламбдътъ!

То си бачка, но print() не е анонимна функция :)

Отговор
в отговор на Hиkoлaй #8

Re: Ето йъ ламбдътъ!

ооо, теоретично няма проблем, но за всякакви примери по-сложни от тоя принт синтаксиса става такъв, че предпочиташ да си го направиш с for(;;)...

boost::bind малко опростява нещата, но само малко...

---
Bingo! Bongo! I don't want to leave the Kongo!
Отговор