Kirchliche Ziffern in Haskell

7

Ich versuche, Kirchenzahlen in Haskell mit den Definitionen zu drucken:

%Vor%

Haskell-Code:

%Vor%

Wenn ich es in der Haskell-Konsole eingebe, erhalte ich einen Fehler, der sagt:

%Vor%

Ich bin nicht in der Lage, genau herauszufinden, was der Fehler sagt.

Danke!

    
Bharat 24.06.2011, 02:37
quelle

2 Antworten

14

Das Problem hier ist, dass es standardmäßig nicht möglich ist, Werte in Haskell zu drucken. Die Standardmethode zum Drucken von Dingen, die unter anderem von der Funktion print und von der GHCi REPL verwendet wird, ist die Funktion show , die durch die Typklasse Show definiert wird.

Der Fehler, den Sie erhalten, informiert Sie darüber, dass Sie einen Ausdruck eines Typs ausgewertet haben, für den keine Instanz von Show definiert ist. Modulo einige Worte, das ist die ganze Fehlermeldung sagt:

%Vor%

Der Typ ((t -> t1) -> t -> t1) wurde für den von Ihnen ausgewerteten Ausdruck abgeleitet. Dies ist ein gültiger Typ für die Kirchennummer 1, obwohl der "richtige" Typ für eine Kirchennummer eigentlich (a -> a) -> a -> a sein sollte.

%Vor%

Es verwendet implizit die Funktion print , um die Werte anzuzeigen. Normalerweise würde dies sagen, wo in Ihrem Programm der Fehler gefunden wurde, aber in diesem Fall heißt es <interactive>:1:0-1 , weil der Fehler durch einen Ausdruck in der REPL verursacht wurde.

%Vor%

Dies ist nur ein Hinweis darauf, dass Sie den Fehler beheben können, indem Sie die erwartete Instanz definieren.

Nun möchten Sie wahrscheinlich Ihre Kirchenziffern wirklich ausdrucken, nicht nur wissen, warum Sie nicht können. Leider ist das nicht so einfach wie das Hinzufügen der gewünschten Instanz: Wenn Sie eine Instanz für (a -> a) -> a -> a schreiben, interpretiert Haskell dies als eine Instanz für eine bestimmte a , während die korrekte Interpretation Eine Church-Zahl ist eine polymorphe Funktion, die an jedem beliebigen a funktioniert.

Mit anderen Worten, Sie möchten, dass Ihre show -Funktion in etwa so aussieht:

%Vor%

Wenn Sie das wirklich wollen, können Sie die Show-Instanz wie folgt implementieren:

%Vor%

und fügen Sie {-#LANGUAGE FlexibleInstances#-} zur ersten Zeile der Datei hinzu. Oder Sie können etwas Ähnliches implementieren, um sie in eine reguläre Zahl zu konvertieren

%Vor%

usw.

    
C. A. McCann 24.06.2011 02:54
quelle
6

EDIT: Spoiler Alert, wie im Kommentar erwähnt

Oder Sie könnten eine Art für Kirchenziffern haben, etwa so:

%Vor%     
sanjoyd 24.06.2011 06:18
quelle

Tags und Links