Haskell - Was macht "main" einzigartig?

7

Mit diesem Code:

%Vor%

Ich habe den folgenden Fehler erhalten:

%Vor%

Aber die Datei wird korrekt kompiliert, wenn ich den Namen von 'main' in etwas anderes ändere.

Was ist so einzigartig an main und warum muss der Typ IO t0 sein?

    
patr1ckm 06.06.2011, 22:09
quelle

4 Antworten

22

Weil die Sprachspezifikation dies sagt .

  

Ein Haskell-Programm ist eine Sammlung von Modulen, von denen eines per Konvention den Namen Main haben muss und den Wert main exportieren muss. Der Wert des Programms ist der Wert des Bezeichners main in Modul Main , der eine Berechnung vom Typ IO t für einen Typ t sein muss (siehe Kapitel 7). Wenn das Programm ausgeführt wird, wird die Berechnung main durchgeführt, und ihr Ergebnis (vom Typ t ) wird verworfen.

    
Cat Plus Plus 06.06.2011, 22:14
quelle
4

Wie GolezTrol sagte, müssen alle Programme wissen, welches Symbol beim Ausführen der Funktion gestartet werden soll. Viele Skriptsprachen benötigen (oder brauchen nicht) eine main -Routine, da sie Anweisungen auf der obersten Ebene haben können. Dies ist bei Haskell, C und vielen anderen nicht der Fall - diese Sprachen benötigen einen Startort und nach Konvention die Funktion main (gemäß der Haskell-Spezifikation - siehe Cat's Antwort).

Hinweis Haskells main akzeptiert keine Parameter, die den Programmargumenten entsprechen - diese werden über System.Environment.getArgs erhalten.

    
Thomas M. DuBuisson 06.06.2011 22:17
quelle
3

Wie in C, Java oder C # ist main eine spezielle Kennung in bestimmten Kontexten, die anzeigt, wo das Programm starten soll.

In Haskell ist für main der Typ IO a definiert. Sie sollten Ihrer Funktion entweder einen anderen Namen geben, oder, wenn Sie es wirklich als Ausgangspunkt haben wollen, ändern Sie ihre Signatur und lassen Sie sie die Argumente von der Kommandozeile mit getArgs

lesen

Obwohl Sie es nicht speziell gefragt haben, ist main auch insofern besonders, als es die einzige Funktion in einem Haskell-Programm ist, die IO-Aktionen (sicher) aufrufen kann. Die Haskell-Laufzeit behandelt main als speziell.

    
Bill 06.06.2011 22:16
quelle
1

Per Definition ist main eine Funktion, die keine Argumente akzeptiert und einen Wert vom Typ IO a zurückgibt, der von der Laufzeitumgebung verworfen wird. Ihre Fehlermeldung besagt, dass Ihr main diese Anforderungen nicht erfüllt. Dies ist in der Tat richtig, da Ihr main zwei Parameter empfängt.

Um auf Kommandozeilenparameter zuzugreifen, verwenden Sie System.Environment.getArgs .

    
gpeche 06.06.2011 22:24
quelle