Haskell vs Lisp vs Scheme etc für KI usw



  • Hallo!

    Haskell, Lisp und Scheme sind ja alles deklarative funktionale Programmiersprachen.

    Und Haskell ist im gegensatz zu Lisp sogar "komplett" funktional.

    Trotzdem wird bei der KI-Programmierung immer Lisp als beste Sprache genannt?

    Wieso ist das so? Was für Faktoren lassen Lisp zu einer guten KI-Programmiersprache werden?

    Wenn es überhaupt so ist: Ist Haskell (und Scheme) in Sachen KI gegenüber Lisp stark unterlegen?

    Und:

    Was meint ihr, welche dieser Programmiersprachen würdet ihr lernen?
    Gehen wir mal davon aus ihr würdet Python und C beherrschen. Würdet ihr als nächstes eine funktionale Sprache lernen um euren Horizont zu erweitern oder doch etwas ganz anderes?

    Danke im voraus!



  • lern lisp, den rest kannste knicken, bzw später dazulernen

    im ernst: Schau dir doch alle genannten sprachen mal an. Fang am besten mit LISP an (common lisp); falls es dir net gefallen sollte, dann shcauste dir die anderen auch noch an



  • Lisp ist nicht "komplett" funktional! Persönlich würde ich dir Common Lisp empfehlen, kenne Haskell aber nicht.



  • hallO dfgdf!

    Das mit dem anschauen ist aber nicht so leicht, da ich von der imperativen Programmierung komme und mir alle funktionalen Sprachen erstmal sehr merkwürdig vorkommen würden.

    Ich müsste mich also, ohne es besser zu wissen, für eine Entscheiden und diese dann auch durchziehen egal wie komisch SIe mir anfangs vorkommt.

    Deshalb meine Frage:

    Wieso empfiehlst du Lisp anstatt zb Haskell?
    Also ich habe zwar öfters gehört, dass Lisp empfohlen wird aber noch nie mit einer Begründung weshalb nicht Haskell...

    Es erscheint mir vor allem merkwürdig da ja Haskell die reinere der beiden Sprachen ist und Lisp eher noch gemischt mit anderen Programmierparadigmen.
    Oder ist gerade diese Mischung die Stärke von Lisp?

    Hat eigentlich jemand Angaben bzgl. Geschwindigkeit und Einsatzgebiet der jeweiligen Sprachen?

    Danke im voraus!

    PS: Warum eigentlich Common Lisp und nicht Lisp?



  • lisps sind eine familie. dazu gehoeren common lisp, emacs lisp, scheme und noch andere.
    persoenlich wuerde ich dir den einstieg mit scheme und sicp empfehlen, und dann CL lernen.

    lisp gilt nur deswegen als gute AI sprache, weil damals, vor dem AI winter, jeder akademiker mit lisp (statt fortran) programmieren wollte. heutzutage relativiert sich das, weil scriptsprachen an maechtigkeit immer mehr zulegen.

    lisp ist imho die reinere sprache, von der syntax her. lisp ist reine baumstruktur, reiner code. deswegen kann ein lisp programm auch lisp programme schreiben, die wiederum lisp programme schreiben koennten.



  • mh... also ich hab ein paar von den funktionalen sprachen durchprobiert und mir gefällt haskell mit abstand am besten. ist natürlich subjektiv, aber wenn ich irgendwas mache wo ich denke eine funktionale sprache wäre toll, nehm ich immer haskell.



  • Danke für die ANtwort!

    Somit ist Scheme schonmal aussortiert und es bleiben nur noch Lisp und Haskell.
    (Hab leider nicht genug Zeit um erstmal das zu lernen und dann das andere. Lieber gleich voll rein mit der Zielsprache.)

    Das mit den Scriptsprachen habe ich auch schonmal gehört. Python zb soll einiges von Lisp und funktionaler Programmierung enthalten.
    Aber heisst das jetzt, dass Lisp garnicht die KI-Sprache schlechthin ist? Sondern, dass Python genauso gut in dem Bereich ist?

    Dein letzter Absatz interessiert mich aber sehr: Ist das nur mit Lisp möglich, dass Programme sich selber "programmieren" können? Denn das ist ein großer Vorteil wenns um AI geht.

    Oder ist dies auch mit Haskell und Python möglich?

    Also ich möcht nochmal direkt frageN:
    Wenn wir davon ausgehen dass jemand bereits Python und C beherrscht. Würdet ihr ihm dann empfehlen Lisp oder Haskell zu lernen? Und warum?

    Es ist für mich wirklich eine schwere Entscheidung da einige von Lisp schwärmen aber die anderen wiederum von Haskell weill es komplett funktional ist...



  • @ borg

    Es währe super wenn du das nochmal ein bisschen begründen könntest.

    Vor allem da du ja schon einige funktionale Sprachen durch hast. Wohl uach schon Lisp?

    Und bei welchen Aufgaben denkst du eine funktionale Sprache währe toll?

    Danke im voraus!



  • Gundalf schrieb:

    (Hab leider nicht genug Zeit um erstmal das zu lernen und dann das andere. Lieber gleich voll rein mit der Zielsprache.)

    Warum? Du solltest sogar auch Scheme lernen.



  • Haskell ist natuerlich auch nicht rein bzw. "komplett" funktional. Das ist aber nicht schlimm, dass das so ist (zum Glueck).

    Um es kurz zu machen:
    Wenn es dir nur um den Erwerb von Kenntnissen im KI-Bereich geht, wuerde ich zu Lisp raten. Falls du keine Emacs-Kenntnisse hast, rate ich dir im speziellen zu clisp, einer Implementierung von Common Lisp.

    Falls du "einfach nur" deinen Horizont erweitern willst, ist denke ich angesichts deiner Python-Vorkenntnisse Haskell die vorzuziehende Wahl, da es deutlich weiter von Python entfernt ist als Lisp.
    Beim Lernen von Haskell wirst du (ziemlich coole) Sprachfeatures entdecken, die in anderen Sprachen nicht mal ansatzweise vorhanden ist.



  • @ Bashar:

    Und warum sollte ich Scheme lernen? Wenn überhaupt, dann währe doch Lisp besser oder?

    @ Dr. Prokt

    Also ist Lisp doch die beste Sprache für KI? Und das nur wegen der reinen Sytax?
    Dieses clisp und auch andere Lisps - sind die weit vom original Lisp (Common Lisp?) entfernt? Oder kann man die anderen auch wenn man das eine kann?

    Ja, eigentlich geht es mir hauptsächlich darum "meinen Horizont zu erwitern".
    Deshalb ist das wieder ein Punkt für Haskell.

    Aber weiss noch jemand über die Verbreitung und die Einsatzgebiete von Lisp und Haskell bescheid? (KI ist klar)
    Welches wird häufiger eingesetzt? Vllt kennt jemand sogar die ganz genauen Einsatzgebiete?

    Thx!



  • Nunja, Common Lisp ist eine standardisierte Sprace und hat einige bekannte Implementierungen, wie z.B. clisp, sbcl, cmucl, ecl, etc. Die implementieren fast alle den Standard zu 100%. Wenn du allerdings auf implementierungsspezifische Details (zB MOP) zugreifst oder auf Features, die nicht im Standard vorgesehen sind (zB Sockets), unterscheiden sie sich natuerlich schon. Allerdings gibt es fuer letzteren Fall implementierungsuebergreifende Libs, die diese Unterschiede wegabstrahieren. Die Wahl der Implementierung ist also nicht so dramatisch.

    Es faellt schwer, Lisp und Haskell direkt miteinander zu vergleichen. Haskell ist im Vergleich zu Lisp eine sehr spezielle spezielle Sprache, geschaffen fuer bestimmte Probleme. Lisp wird hingegen eher nachgesagt, ein "Programmiermedium" zu sein, man kann die Sprache nach seinen Vorstellungen biegen und formen (entsprechende Kenntnisse vorausgesetzt 😉 ).

    Haskell ist eine funktionale Sprache, die zwar aus der Theorie kommt, aber enorm an praktischer Bedeutung gewonnen hat. Sie kann mittlerweile ueberall dort eingesetzt werden, wo Mainstream-Sprachen auch Anwendung finden (es gibt sogar schon ein Mini-Framewort zur Entwicklung dynamischer Webseiten), nur dass man eine neue Sicht auf viele schon bekannte Dinge erhaelt.

    Wenn du die Zeit findest, schau dir am besten beides an.



  • ohne nun mit lisp oder haskell übermäßig viel gearbeitet zu haben, kann ich doch sagen, dass bei sprachen grundverschieden sind, auch wenn sie unter dem label "funktional" laufen.
    ich glaube, der witz bei lisp ist vorallem, dass man mit lisp - code (sehr vereinfacht gesprochen) wie mit strings umgehen kann, soll heissen, man kann programmcode während der laufzeit automatisch generieren, ändern etc. - und eben auch ausführen lassen. aus dem bauch heraus würde ich sagen, dass das für KI sachen durchaus nützlich sein könnte..



  • lisp ist imho die reinere sprache, von der syntax her. lisp ist reine baumstruktur, reiner code. deswegen kann ein lisp programm auch lisp programme schreiben, die wiederum lisp programme schreiben koennten.

    Was erzählst du da eigentlich? Was soll den "unreiner" Code sein? Ich kann dir auch ein Java Programm schreiben, das ein Java Programm schreibt usw....

    Meinst du vielleicht das Lisp eine echte funktionale Sprache ist? Also ohne Gedächniss und Seiteneffekten?



  • DEvent schrieb:

    Ich kann dir auch ein Java Programm schreiben, das ein Java Programm schreibt usw....

    und ich kann mit einem stein eine schraube in die wand hämmern.



  • Doktor Prokt schrieb:

    Haskell ist natuerlich auch nicht rein bzw. "komplett" funktional. Das ist aber nicht schlimm, dass das so ist (zum Glueck).

    Abgesehen von den Funktionen mit "unsafe"-Prefix ist Haskell tatsächlich rein funktional, sprich völlig seiteneffektfrei; oder ich habe Haskell grundlegend falsch verstanden. Selbst Ein/Ausgabe wie getLine/putStrLn wird über Datenabhängigkeiten dargestellt, nicht über Seiteneffekte.

    Dass der Compiler den Haskell-Code zwangsläufig in imperativen Maschinen-Code transformiert, ist ein anderer Punkt. Auf Haskell-Ebene ist der Code meines Wissens nach jedoch immer seiteneffektfrei (von den "bösen" unsafe-Funktionen abgesehen, die nur äußerst selten gebraucht werden, und AFAIK auch dann nur um bestimmte Komplexitätsklassen zu erreichen). Eine Funktion wie "getLine" liefert zum Beispiel bei jedem Aufruf dasselbe Objekt zurück; das ist der Grund warum getLine nicht einfach einen String liefern kann.



  • DEvent schrieb:

    Meinst du vielleicht das Lisp eine echte funktionale Sprache ist? Also ohne Gedächniss und Seiteneffekten?

    Das Lisp keine "echte funktionale" Sprache ist, hatten wir doch schon erwähnt? Nicht?

    Ansonsten fällt es sicher schwer Lisp ohne Lisp Kenntnisse zu bewerten und wie groß sind bitte deine Lisp-Kenntnisse?



  • Christoph schrieb:

    Dass der Compiler den Haskell-Code zwangsläufig in imperativen Maschinen-Code transformiert, ist ein anderer Punkt.

    Jo, darauf wollte ich auch nicht abzielen, ganz so kleinlich bin ich dann doch nicht 😉

    Ich sehe ein Problem bei der IO Monad. Wenn zum Beispiel eine hypothetische Funktion getLine ein IO String zurueckgibt, so gibt es sehrwohl viele Werte, welche eben diesen Typ haben.



  • Doktor Prokt schrieb:

    Christoph schrieb:

    Dass der Compiler den Haskell-Code zwangsläufig in imperativen Maschinen-Code transformiert, ist ein anderer Punkt.

    Jo, darauf wollte ich auch nicht abzielen, ganz so kleinlich bin ich dann doch nicht 😉

    Ich sehe ein Problem bei der IO Monad. Wenn zum Beispiel eine hypothetische Funktion getLine ein IO String zurueckgibt, so gibt es sehrwohl viele Werte, welche eben diesen Typ haben.

    Nein, getLine liefert aus Haskell-Sicht immer dasselbe Objekt zurück. Das kann man z.B. daran sehen, dass du sowas schreiben kannst wie

    myGetLine = getLine
    

    und dann im folgenden myGetLine anstelle getLine benutzt.
    getLine liefert ein anderes "IO String"-Objekt als z.B. die Funktion hGetContents, was den ganzen verfügbaren Eingabe-Stream als IO String liefert.

    In Haskell sind Funktionen mit null Parametern automatisch konstante Werte.

    Das IO String-Objekt von getLine kann man auch als Handle betrachten. Das stdin-Handle ist z.B. immer identisch, ebenso wie eben der Rückgabewert von getLine. Nur wenn man etwas damit anfängt, wird zusätzliche Status-Information gebraucht, die implizit im IO Monad steckt. Das State-Monad zeigt sehr schön, wie man diese Statusinformation verstecken und nutzen kann; das State Monad lässt sich mit wenigen (seiteneffektfreien!) Zeilen komplett in Haskell implementieren.



  • DEvent schrieb:

    Was erzählst du da eigentlich? Was soll den "unreiner" Code sein?

    hab ich doch geschrieben: die syntax, naemlich keine. nur baumstruktur. alles einheitlich.
    wenns nur ein problem mit meiner aussprache oder deinen loeffeln waere, aber nein, es sind deine augen 😮


Anmelden zum Antworten