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))
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top