Comment utiliser fromInteger dans Haskell?
Question
Une façon de calculer 2 ^ 8 en Haskell est en écrivant
product(replicate 8 2)
Lorsque vous essayez de créer une fonction pour cela, défini comme suit ...
power1 :: Integer → Integer → Integer
power1 n k | k < 0 = error errorText
power1 n 0 = 1
power1 n k = product(replicate k n)
je reçois l'erreur suivante:
Couldn't match expected type 'Int' against inferred type 'Integer'
Je suppose que je dois utiliser la fonction fromInteger quelque part ... Je ne suis pas sûr où ou comment? Est-ce une interface ou ce qui est fromInteger, et comment dois-je utiliser?
Merci
La solution
Tout d'abord, ne jamais utiliser fromInteger. Utilisez fromIntegral.
Vous pouvez voir où l'erreur de type est en regardant le type de réplication:
replicate :: Int -> a -> [a]
donc quand vous GIV il « k » comme argument, que vous avez prétendiez est un nombre entier via la déclaration de type, nous avons une erreur de type.
Une meilleure approche pour ce serait d'utiliser genericReplicate:
genericReplicate :: (Integral i) => i -> a -> [a]
Alors:
power1 n k = product (genericReplicate k n)
Autres conseils
Peut-être une solution plus simple consiste à modifier la définition du type de la fonction:
power1 :: Integer -> Int -> Integer
Vous devriez regarder le reste du message d'erreur ainsi, il vous dit exactement la réponse à votre question:
Couldnt match expected type 'Int' against inferred type 'Integer'
In the first argument of 'replicate', namely 'k'
In the first argument of 'product', namely '(replicate k n)'
In the expression: product (replicate k n)
« Dans le premier argument de réplication. » C'est l'endroit idéal pour ajouter le fromIntegral
.