Question

J'apprends Haskell. Je fonction créée qui retourne la table de multiplication jusqu'à « n » dans « b » base. Les nombres sont rembourrés pour les chiffres « W ». La dernière étape, je veux calculer « w » automatiquement. Pourquoi cela ne compile?

-- 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)) 

Erreur:

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))
Était-ce utile?

La solution

Logbase prend deux paramètres qui mettent en œuvre la classe de types flottant. Vous aurez besoin d'appeler fromIntegral sur les paramètres avant de les transmettre à Logbase. Cette compilation pour moi avec 6.10.3:

nOfDg :: Int -> Int-> Int
nOfDg n base = 1 + floor ( logBase (fromIntegral base) (fromIntegral (n*n)))

Vous devez vous rappeler que Haskell est très fortement typé, de sorte que vous ne pouvez pas simplement supposer que les paramètres Int fournis à votre fonction seront automatiquement converties aux nombres flottants qui se connectent les fonctions prennent généralement.

Autres conseils

logBase est déclaré travailler sur les types de virgule flottante. Int est pas un type à virgule flottante et il est pas de conversion automatique Haskell. Essayez ceci:

-- 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)))

A partir du Prélude:

logBase :: Floating a => a -> a -> a

Cela signifie que l'utilisation Logbase vous devez utiliser un type flottant. Mais Int est pas un type flottant, et il n'y a pas de conversion automatique pour les types numériques, donc vous devez le convertir de Int à un type flottant:

nOfDg n base = 1 + floor ( logBase (toEnum base) (toEnum n))

la fonction toEnum prendre un int en tant que paramètre et un type de retour « Enum ». La bonne nouvelle est que Float est une instance de Enum, vous pouvez donc l'utiliser

toEnum :: Enum a => Int -> a

Vous devriez lire / document que vous sur les classes de type standard dans haskell pour les types numériques (Num, Fractional, intégrale, flottant ...) comme ils pop-up souvent dans le code, les conversions d'apprentissage pourrait être utile.

Edit: cette Haskell Wiki livre fournir un graphique très utile de la relation entre les normes de type classe, y compris les types numériques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top