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?
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?
Antworten:
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.
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.
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 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.
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.
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.
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.
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
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 .
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.
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.