Keine Instanz für (Floating Int)

8

Ich lerne Haskell. Ich habe eine Funktion erstellt, die die Multiplikationstabelle auf 'n' in der Basis 'b' zurückgibt. Zahlen werden auf "w" Ziffern aufgefüllt. Als letzten Schritt möchte ich 'w' automatisch berechnen. Warum kompiliert das nicht?

%Vor%

Fehler:

%Vor%     
danatel 28.12.2009, 17:16
quelle

3 Antworten

11

logBase benötigt zwei Parameter, die die Floating-Klasse implementieren. Sie müssen von Integral die Parameter aufrufen, bevor Sie sie an logBase übergeben. Das kompilierte für mich mit 6.10.3:

%Vor%

Sie müssen sich daran erinnern, dass Haskell sehr stark typisiert ist, so dass Sie nicht einfach davon ausgehen können, dass die Int-Parameter, die an Ihre Funktion übergeben werden, automatisch zu den Gleitkommazahlen werden, die log-Funktionen normalerweise übernehmen.

    
maxaposteriori 28.12.2009, 17:22
quelle
5

logBase wird für die Arbeit mit Fließkommatypen deklariert. Int ist kein Fließkommatyp und es gibt keine automatische Konvertierung in Haskell . Versuchen Sie Folgendes:

%Vor%     
Dan Dyer 28.12.2009 17:27
quelle
3

Aus dem Vorspiel:

%Vor%

Das bedeutet, dass Sie logBase verwenden müssen, wenn Sie einen Floating-Typ verwenden. Aber Int ist kein schwebender Typ und es gibt keine automatische Konvertierung für numerische Typen, daher müssen Sie ihn von Int in einen Floating-Typ konvertieren:

%Vor%

Die Funktion toEnum nimmt einen int als Parameter und gibt einen "Enum" -Typ zurück. Der gute Teil ist, dass Float eine Instanz von Enum ist, also könnten Sie es verwenden

%Vor%

Sie sollten Sie über Standardtypklassen in Haskell für numerische Typen (Num, Fractional, Integral, Floating ...) lesen / dokumentieren, da sie häufig im Code auftauchen. Das Lernen von Conversions könnte nützlich sein.

Bearbeiten: Diese Haskell Wiki-Buch bietet eine sehr nützliche Grafik der Beziehung zwischen Standard-Klassen, einschließlich numerischer Typen .

    
Raoul Supercopter 28.12.2009 17:28
quelle

Tags und Links