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

Était-ce utile?

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.

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