
Анонимни функции, известни като ламбда функции, са неразделна част от езиците за функционално програмиране като Haskell. За разлика от традиционните функции, анонимните функции нямат име. Те се дефинират в движение и обикновено се използват, когато дадена функция е необходима само веднъж. Нека се потопим в проблем, който може да бъде разрешен ефективно с помощта на анонимни функции.
Проблемът
Представете си, че се опитвате да анализирате списък от думи и трябва да манипулирате статистически данните. Искате да преброите срещанията на всяка дължина на думата в списъка. За да направите кода си по-кратък и по-лесен за поддръжка, вие решавате да използвате анонимни функции.
Решение с анонимни функции
[псевдокод lang=”Haskell”]
импортиране на Data.List
импортирайте квалифицирани Data.Map като карта
wordLengthCount :: [String] -> Map.Map Int Int
wordLengthCount = Map.fromListWith (+) . карта (x -> (дължина x, 1))
[/псевдокод]
Нека разопаковаме решението стъпка по стъпка.
Подробно обяснение на кода
В първия ред импортираме необходимите библиотеки. „Data.List“ предоставя функции за манипулиране на списъци, докато „Data.Map“ ни дава достъп до тип данни, който може да се използва за прилагане на структура от данни за карта.
Функцията 'wordLengthCount' приема списък от думи (низове) като аргумент и връща карта, която съдържа броя на срещанията на всяка дължина на думата.
Първо, използваме функцията map, за да приложим анонимната функция към всяка дума в списъка. Нашата анонимна функция или ламбда функция се дефинира като:
[псевдокод lang=”Haskell”]
x -> (дължина x, 1)
[/псевдокод]
Функцията ламбда приема дума като вход ('x') и извежда кортеж – дължината на думата и 1. След като тази операция се приложи към всяка дума в списъка, завършваме със списък от кортежи.
След това използваме функцията „Map.fromListWith“. Функцията 'fromListWith' е удобна функция, която взема двоична функция и списък от кортежи и създава карта.
Двоичната функция е (+), която събира вторите елементи на кортежите, ако първите им елементи съвпадат. По този начин функцията взема нашия списък с кортежи, групира ги по дължина на думата и добавя вторите елементи на кортежите – като по същество брои срещанията на всяка дължина на думата.
Библиотеки и функции на Haskell
В този код използвахме доста библиотеки и функции на Haskell. "Data.List" намлява "Data.Map" библиотеките са от съществено значение за манипулиране на данни и структура в Haskell. The "карта" функция изигра важна роля в прилагането на нашата анонимна функция към всеки елемент в нашия списък, значително намалявайки сложността на нашия код.
Освен това, 'fromListWith' функция от „Data.Map“ ни позволи ефективно да групираме нашите данни по дължина на думата и да изчислим общия брой срещания.
Силата на Haskell наистина блести, когато използваме всички тези концепции заедно, демонстрирайки ефективността и изразителността на функционалните езици за програмиране.
От гледна точка на модата, елегантността и простотата на този анонимен код, управляван от функции, могат да бъдат оприличени на минималистична модна тенденция, където по-малкото е повече и всяка част (или функция) трябва да служи на ясна, кратка цел. Подобно на чистите линии и чистата естетика в минималистичния стил, анонимните функции в Haskell предлагат кратък, изчистен код, който работи с несравнима ефективност и елегантност.