anonimowe funkcje lambda (programowanie funkcjonalne)


10

Co to są funkcje anonimowe (lambda)? Jaka jest formalna definicja anonimowej funkcji w funkcjonalnym języku programowania?

Mówiąc najprościej, kiedy programuję w schemacie / lisp, powiedziałbym, że funkcja anonimowa (lambda) jest funkcją niezwiązaną z identyfikatorem.

Czy to wszystko, co możesz formalnie powiedzieć o funkcji lambda? Myślę, że do tej prostej definicji można dodać więcej szczegółów. Proszę opracować i dziękuję!


Odpowiedzi:


10

Moim zdaniem to wszystko, co naprawdę możesz o nich powiedzieć.

Chodzi o to, że w języku wyższego rzędu funkcja jest po prostu innym rodzajem wartości. W ten sam sposób możesz mieć (3 + 4) bez identyfikatora w C, możesz mieć (lambda (x) + (3 x))) bez identyfikatora w schemacie.

Kluczem tutaj nie jest to, że w funkcjach anonimowych jest coś specjalnego. Jedynie ograniczenia innych języków wymagają, aby funkcje były traktowane inaczej niż inne wartości. Specjalne definicje dotyczą języków proceduralnych, które na to nie pozwalają, a nie języków funkcjonalnych z do.


11

W rachunku lambda wszystkie funkcje (terminy) są anonimowe. Jest to istotna właściwość rachunku lambda: możesz tworzyć złożone funkcje od prostszych bez nadawania im nazw.

W językach programowania w większości przypadków pożądane jest nadawanie nazw funkcjom, ponieważ tak myślimy i sprawia, że ​​kod jest czytelny dla ludzi. Ale kompilacja ostatecznie usuwa te nazwy podczas tworzenia pliku wykonywalnego (jeśli zignorujemy informacje debugowania).

Jeśli język pozwala na wyrażanie funkcji anonimowych (tj. Funkcji bez nazw), może dać przewagę zarówno programistom, jak i kompilatorom: programiści często mogą pisać krótszy kod, a kompilatory mogą lepiej optymalizować, wiedząc, że anonimowa funkcja jest używana tylko przy danym miejsce i nigdzie indziej.


1

To zależy od tego, na którą część twojego pytania akcentujesz. Jeśli jest to w szczególności właściwość anonimowości dla funkcji anonimowych, to w rzeczywistości jedyną odpowiedzią jest to, że są to wartości niezwiązane . Jeśli mówimy o funkcjach w ogólności, funkcje anonimowe są prawdopodobnie najbardziej widocznym przejawem stosowania rachunku lambda w funkcjonalnym otoczeniu, dla języków aplikacyjnych .

W rzeczywistości, z punktu widzenia rachunku lambda, wyrażenia lambda są bardzo syntaktycznym konstruktem używanym do tworzenia powiązań. Przypomnijmy notację stosowaną w rachunku lambda:

λfa.λx.fax

faxfax

Język zwykle oferuje sposoby, takie jak let(ML, takie jak języki, schemat) lub define(schemat) do tworzenia powiązań, które można wykorzystać na najwyższym poziomie (lub w konstrukcjach składniowych bardziej złożonych niż funkcje, takie jak moduły lub obiekty), ale jest to jedyne potrzebne narzędzie do wiązania są lambda na niższych poziomach.

Jeśli spojrzysz na języki takie jak dialekty schematu lub seplenienia, ich fundamentem jest rachunek lambda, a wiele specjalnych form to naprawdę lambda pokryte cukrem.

W przypadku języków konkatenatywnych historia jest nieco inna. Jagnięta nie są konieczne i faktycznie przynoszą efekt przeciwny do zamierzonego. Po co definiować anonimowe lambdy, skoro wszystko jest funkcją ?

Istnieje jakaś dwoistość między tymi dwoma rodzajami języków. Później koncentruje się na kombinacji funkcji bez punktów, a zatem próbuje przedstawić wszystko jako funkcje, podczas gdy pierwsza z nich działa na bardziej rozbudowanym rachunku różniczkowym i stara się mieć funkcje jako wartości pierwszej klasy, podobnie jak inne wartości języka. Pod tym względem można było postrzegać lambdas jako wynik tego wysiłku.

Niektóre wskazówki na temat wprowadzone (słabo) w tej odpowiedzi:

  • artykuł Jona Purdy'ego na temat języków konkatenatywnych
  • dyskusja, która nastąpiła na LtU
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.