Wie hilfreich ist es, Lambda-Kalkül zu kennen? [geschlossen]


72

An alle, die sich mit Lambda-Kalkül auskennen : Welchen Nutzen hat es Ihnen in Bezug auf die Programmierung gebracht? Würden Sie den Leuten empfehlen, es zu lernen?


Entschuldigung für die Bearbeitung, dachte, Mathe + Mathe sei ein doppeltes Tag.
William Keller

Antworten:


27

Wenn Sie in einer funktionalen Programmiersprache programmieren möchten , ist dies unerlässlich. Ich meine, wie nützlich ist es, über Turing-Maschinen Bescheid zu wissen? Wenn Sie C schreiben, ist das Sprachparadigma den Turing-Maschinen ziemlich nahe - Sie haben einen Befehlszeiger und einen aktuellen Befehl, und der Computer führt im aktuellen Zustand eine Aktion aus und schlendert dann zum nächsten Befehl.

In einer funktionalen Sprache kann man einfach nicht so denken - das ist nicht das Sprachparadigma. Sie müssen an die Lambda-Rechnung zurückdenken und wie Begriffe dort bewertet werden. Es wird für Sie viel schwieriger sein, in einer funktionalen Sprache effektiv zu sein, wenn Sie die Lambda-Rechnung nicht kennen.


74
Ich bezweifle aufrichtig, dass dies für die funktionale Programmierung wesentlich ist (wie ich in meiner eigenen Antwort festgestellt habe). Außerdem werden Turing-Maschinen praktisch nie (wenn überhaupt) verwendet, um die imperative Programmierung zu verstehen.
Mweerden

1
Ich denke, dies ist eine Frage von "diejenigen, die LISP nicht verstehen, sind dazu verdammt, es neu zu erfinden", wo, obwohl ich mir vorstelle, dass die überwiegende Mehrheit der Programmierer aus einem starken imperativen Hintergrund stammt, in dem der Begriff der Schleifen für die Summierung üblich ist, und die Idee des Arrays Reduktion gab es nicht. Im Gegenzug versuchen wir alle, mehr Kontrolle und Disziplin über unsere Berechnungen zu erlangen, und die einzig vernünftige Richtung ist die Richtung des Lambda-Kalküls, die wir wiederum neu erfinden oder aus Programmiersprachen verdauen, die Ihnen aber keinen Lambda-Kalkül beibringen Sie "bekommen" einfach viel davon.
Dmitry

@Dmitry Ich meine, die Idee von Lambda ist so praktisch, dass viele von uns dazu neigen, es einfach "neu zu erfinden", INSBESONDERE, wenn Sie ein Metaprogrammierer sind, der Präprozessoren für ihren Code schreibt, um "for" -Schleifen in "for" -Schleifen umzuwandeln Durch einfache Transformationen oder wenn Sie darüber nachdenken, spricht der Lambda-Kalkül im Allgemeinen viele Dinge an, an die Sie denken, während Sie Präprozessoren auf natürliche Weise schreiben, da Sie nur an Transformationen denken und wie Sie sie so lange wie möglich verketten können, vorzugsweise bis zum Ende. Ohne Lambdas wird man einfach von Komplexität überwältigt und alles fällt auseinander oder ist unüberschaubar.
Dmitry

84

Der Vorteil der Lambda-Rechnung besteht darin, dass es sich um ein äußerst einfaches Berechnungsmodell handelt, das einer Turing-Maschine entspricht. Während eine Turing-Maschine eher einer Assemblersprache ähnelt, ähnelt Lambda-Kalkül eher einer Hochsprache. Und wenn Sie Church-Codierungen lernen , die Ihnen helfen, die Programmiertechnik zu erlernen, die als Continuation-Passing-Stil bezeichnet wird und die für die Implementierung der Backtracking-Suche und anderer netter Tricks sehr nützlich ist.

Die Hauptanwendung von Lambda-Kalkül in der Praxis ist, dass es ein großartiges Laborwerkzeug ist, um neue Ideen für Programmiersprachen zu studieren . Wenn Sie eine Idee für eine neue Sprachfunktion haben, können Sie die neue Funktion zum Lambda-Kalkül hinzufügen und erhalten etwas, das ausdrucksstark genug ist, um programmiert zu werden, während es einfach genug ist, um sehr gründlich zu lernen . Diese Verwendung ist wirklich mehr für Sprachdesigner und Theoretiker als für Programmierer.

Lambda-Kalkül ist auch an sich schon sehr cool: Genau wie die Kenntnis der Assemblersprache wird es Ihr Verständnis der Berechnung vertiefen . Es macht besonders Spaß, eine universelle Turingmaschine im Lambda-Kalkül zu programmieren . Dies ist jedoch grundlegende Mathematik, keine praktische Programmierung.


7
Ich sehe keinen Zusammenhang zwischen den Kodierungen der Kirche und dem CPS.
Cdiggins

24

Um ehrlich zu sein, hat mir das Erlernen der Lambda-Rechnung vor der funktionalen Programmierung klar gemacht, dass die beiden so unabhängig sind wie C mit jeder imperativen Programmierung.

Lambda-Kalkül ist eine funktionale Programmiersprache, eine esoterische, eine Turing-Tarpit, wenn Sie möchten; aus Versehen ist es auch das erste.

Bei den meisten funktionalen Programmiersprachen müssen Sie den Lambda-Kalkül nicht "lernen". Was auch immer das bedeuten würde, der Lambda-Kalkül ist wahnsinnig minimal. Sie können seine Axiome in weniger als einer Stunde "lernen". Um die Ergebnisse daraus zu kennen, wie das Fixpunkt-Theorem, ist das Church-Rosser-Theorem und so weiter für die funktionale Programmierung einfach irrelevant.

Außerdem werden Lambda-Abstraktionen oft als "Funktionen" angesehen. Ich bin damit nicht einverstanden. Sie sind Algorithmen, keine Funktionen, ein kleiner Unterschied. Die meisten "funktionalen Sprachen" behandeln ihre Funktionen eher wie die klassische Mathematik.

Um beispielsweise Haskell effektiv nutzen zu können, müssen Sie bestimmte Typsysteme verstehen. Dies ist unabhängig von der Lambda-Rechnung. Das System F-System kann auf alle 'Funktionen' angewendet werden und erfordert überhaupt keine Lambda-Abstraktionen. In der Mathematik sagen wir gewöhnlich f: R ^ 2 -> R: f (x) = x ^ 2. Wir hätten sagen können: f (x) = x ^ 2 :: R -> R -> R. Tatsächlich kommt Haskell dieser Notation ziemlich nahe.

Der Lambda-Kalkül ist ein theoretischer Formalismus. Haskells Funktionen sind eigentlich nicht mehr 'Lambda-Abstraktionen' als f: f (x) = x ^ 2. Was Lambda-Abstraktionen wirklich interessant macht, ist, dass wir damit definieren können, was normalerweise als 'Konstanten' angesehen wird. Als 'Funktionen' macht dies keine funktionale Sprache aufgrund des enormen Rechenaufwands. Haskell und andere sind nur eine eingeschränkte Form des Systems vom Typ System F, das auf Funktionen angewendet wird, wie sie in der alltäglichen klassischen Mathematik verwendet werden. Funktionen in Haskell sind sicherlich nicht die anonymen formal symbolischen Reduktionsantragsteller wie im Lambda-Kalkül. Die meisten funktionalen Programmiersprachen sind keine symbolischen reduktionsbasierten Umschreibesysteme. Lisps sind bis zu einem gewissen Grad, aber das ist ein Paradigma für sich und sein 'Lambda-Schlüsselwort' tut es wirklich nicht. '


Ich stimme dem Punkt zu: Sie möchten getippte Lambda-Kalküle lernen . Es ist wahnsinnig wichtig in z. Haskell.
Alexandre C.

16

Ich denke, die Verwendung von Lambda-Kalkül in Bezug auf die Programmierung in der Praxis besteht darin, dass es sich um ein recht minimales System handelt, das die Essenz der Abstraktion (oder "anonyme Funktionen" oder Verschlüsse, wenn Sie so wollen) erfasst. Abgesehen davon halte ich es im Allgemeinen nicht für wesentlich, es sei denn, Sie müssen die Abstraktion selbst implementieren (wie Tetha ( 114646 ) erwähnt).

Ich bin auch völlig anderer Meinung als Denis Bueno ( 114701 ), der sagt, dass dies für die funktionale Programmierung wesentlich ist. Es ist durchaus möglich, eine funktionale Sprache ohne Lambda-Kalkül zu definieren, zu verwenden oder zu verstehen. Um die Bewertung von Begriffen in funktionalen Sprachen zu verstehen (was meiner Meinung nach der Verwendung einer funktionalen Sprache etwas widerspricht), sollten Sie höchstwahrscheinlich besser über Systeme zum Umschreiben von Begriffen lernen.


13

Ich stimme denen zu, die sagen, dass es theoretisch möglich ist, funktionale Programmierung zu lernen, ohne den Lambda-Kalkül zu lernen - aber was ist der Vorteil, wenn man den Lambda-Kalkül nicht lernt? Es ist nicht so, als würde es viel Zeit kosten.

Höchstwahrscheinlich wird es Ihnen helfen, die funktionale Programmierung besser zu verstehen. Aber auch wenn es nicht so ist, ist es immer noch eine coole Sache, die es wert ist, gelernt zu werden. Der Y-Kombinator ist etwas Schönes.


3
Der Lambda-Kalkül ist ohne Zweifel eine wunderbare Sache, die es wert ist, gelernt zu werden. Es überrascht mich jedoch wirklich, diese Behauptungen zu lesen, dass sie hilfreich (oder sogar wesentlich) für das Verständnis der funktionalen Programmierung sind. Es fällt mir schwer herauszufinden, wie es helfen würde. Vermisse ich hier etwas?
Mweerden

7
+1 für die einzige Antwort, die das Wort "Schönheit" erwähnt. Abgesehen von der praktischen Debatte ist es möglicherweise das schönste Gebiet der Mathematik, das ich bisher studiert habe.
Keith Pinson

11

Wenn Sie nur Techniker sein und Programme schreiben möchten, um Dinge zu tun, müssen Sie Lambda-Kalkül, Finite-State-Maschinen, Pushdown-Automaten, reguläre Ausdrücke, kontextfreie Grammatik, diskrete Mathematik usw. nicht wirklich kennen.

Wenn Sie jedoch neugierig auf die tieferen Geheimnisse sind, die diesem Zeug zugrunde liegen, können Sie sich fragen, wie diese Fragen beantwortet werden könnten. Die Konzepte sind wunderschön und erweitern Ihre Fantasie. Ich denke auch, dass sie einen übrigens zu einem besseren Praktiker machen.

Was mich begeistert hat, war Minskys Buch Computation: Finite and Infinite Machines.


2
Sie müssen nicht haben zu „Finite-State - Maschinen, reguläre Ausdrücke, kontextfreie Grammatik“ wissen, aber diese sind in vielen programing Aufgaben sehr nützlich. Ohne diese wäre ich 1/100 effektiv. Verwenden Sie beispielsweise nicht GREP?
TFuto

@TFuto: Ich bin auf Windows. Ich verwenden haben , grep, aber mit diesem höllischen Upgrades, das Zeug zur Arbeit verwendete nicht mehr :) Auch diese formalen Konzepte sind auf der erfinderischen Seite des CS, in Bezug auf die konformistische Seite gegenüber . Sie bringen mich in Schwierigkeiten, wie hier .
Mike Dunlavey

1
Ich schlage vor, dass Sie REGEXPs erneut besuchen, z. B. in Java. Das ist eine sehr ausdrucksstarke Sache und bei kluger Verwendung eine große Zeitersparnis. Übrigens können Sie GREP unter Windows mit Cygwin verwenden oder mit MinGW kompilieren. Und wenn Sie etwas mehr Zeit haben, ist das Verstehen von zB ANTLR ein enormer Sprung in der Entwicklungskraft. Sie können Parser für eine große Anzahl von Sprachen generieren ... So können Sie die manuelle Analyse und Validierung von Eingaben ersetzen.
TFuto

5

Der Lambda-Kalkül ist genau wie die Turingmaschine ein Rechenmodell. Daher ist es nützlich, wenn Sie einen bestimmten Evaluator für eine Sprache implementieren müssen, die auf diesem Modell basiert. In der Praxis benötigen Sie jedoch nur die Grundidee (ähm. Argument semantisch korrekt im Hauptteil einer Funktion platzieren?) Und das ist ungefähr es.


4

Ein möglicher Weg, um Lambda-Kalkül zu lernen, ist

http://en.wikipedia.org/wiki/Lambda_Calculus

Oder, wenn Sie mehr wollen, hier ist mein Blog, der sich dem Lambda-Kalkül und ähnlichen Dingen widmet

http://weblogs.manas.com.ar/lziliani/

Wie bei jeder Abstraktion von Berechnungen können Sie mit Lambda-Kalkül Dinge modellieren, die in den meisten Programmiersprachen verwendet werden, z. B. Subtypisierung. Um mehr darüber zu erfahren, ist eines der besten Bücher mit praktischen Anwendungen der Lambda-Rechnung in diesem Sinne

http://www.amazon.com/Types-Programming-Languages-Benjamin-Pierce/dp/0262162091/ref=sr_1_1?ie=UTF8&s=books&qid=1222088714&sr=8-1


3
Für mich ist das Buch Einführung in die funktionale Programmierung durch Lambda-Kalkül der beste Ausgangspunkt.
Edwin Dalorzo

4

Ich fand, dass der Lambda-Kalkül nützlich war, um zu verstehen, wie funktionale Programmierung auf einer tieferen Ebene funktioniert. Insbesondere wie man funktionale Sprachen implementiert.

Es hat mir das Verständnis fortgeschrittener Konzepte wie Typensysteme und Bewertungsstrategien erleichtert (z. B. Call by Name versus Call by Value).

Ich glaube nicht, dass man etwas über den Lambda-Kalkül wissen muss, um grundlegende funktionale Programmiertechniken zu verwenden. Das Verständnis der Lambda-Rechnung erleichtert jedoch das Erlernen der fortgeschrittenen Programmiertheorie .


3

Ich möchte auch erwähnen, dass, wenn Sie etwas im Bereich NLP tun, die Lambda-Rechnung die Grundlage für eine umfangreiche Arbeit in der kompositorischen Semantik bildet.


0

Der Vorteil für mich ist eine kompaktere synergistische Programmierung. Sachen fließen eher horizontal als vertikal. Außerdem ist es sehr nützlich für das Prototyping einfacher Algorithmen. Ich weiß nicht, ob ich es voll ausnutzen kann, aber ich finde es sehr nützlich.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.