Kein Beispiel für (Floating Int)
Frage
Ich lerne Haskell. Ich habe Funktion geschaffen, die Multiplikationstabelle zu ‚n‘ in der Basis zurückkehrt up ‚b‘. Die Zahlen sind zu ‚w‘ Ziffern aufgefüllt. Als letzter Schritt möchte ich ‚w‘ automatisch berechnen. Warum funktioniert das nicht kompilieren?
-- Number of digits needed for the multiplication table n*n in base 'base'
nOfDg :: Int -> Int-> Int
nOfDg n base = 1 + floor ( logBase base (n*n))
Fehler:
No instance for (Floating Int)
arising from a use of `logBase' at C:\haskel\dgnum.hs:4:24-38
Possible fix: add an instance declaration for (Floating Int)
In the first argument of `floor', namely `(logBase b (n * n))'
In the second argument of `(+)', namely `floor (logBase b (n * n))'
In the expression: 1 + floor (logBase b (n * n))
Lösung
LogBase nimmt zwei Parameter, die die Floating-typeclass implementieren. Sie müssen fromIntegral auf den Parametern aufrufen, bevor sie zu LogBase vorbei. Das ist für mich zusammengestellt mit 6.10.3:
nOfDg :: Int -> Int-> Int
nOfDg n base = 1 + floor ( logBase (fromIntegral base) (fromIntegral (n*n)))
Sie müssen bedenken, dass Haskell ist sehr stark typisiert, so dass Sie nicht nur kann davon ausgehen, dass die Int-Parameter an die Funktion geliefert wird automatisch auf den schwimmenden Zahlen dazu gezwungen werden, dass Log-Funktionen im Allgemeinen nehmen.
Andere Tipps
logBase
an Arbeit auf Gleitkommatypen erklärt. Int ist kein Gleitkommatyps und es gibt keine automatische rel="noreferrer">. Versuchen Sie folgendes:
-- Number of digits needed for the multiplication table n*n in base 'base'
nOfDg :: Int -> Float -> Int
nOfDg n base = 1 + floor (logBase base (fromIntegral (n*n)))
Aus dem Vorwort:
logBase :: Floating a => a -> a -> a
Es bedeutet, dass LogBase verwenden müssen Sie einen schwimmenden werden. Aber Int ist kein Schwimm Typ, und es gibt keine automatische Konvertierung für numerische Typen, so dass Sie es von Int Schwimmender konvertieren:
nOfDg n base = 1 + floor ( logBase (toEnum base) (toEnum n))
die toEnum Funktion einen int als Parameter übernimmt und gibt eine „Enum“ -Typ. Das Gute ist, dass Float ist eine Instanz von Enum, so dass Sie es
verwenden könntentoEnum :: Enum a => Int -> a
Sie sollten Sie über Standardtypklassen in Haskell Lese- / Dokument für numerische Typen (Num, Fractional, Integral, schwimmend ...), wie sie häufig in Code Pop-up, das Lernen Konvertierungen nützlich sein könnten.
Edit: diese Haskell-Wiki eine sehr nützliche Grafik der Beziehung zwischen Standards bieten Typ-Klasse, einschließlich numerischen Typen.