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:
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.
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.
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:
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
usw.
Tags und Links haskell lambda-calculus