Come utilizzare fromInteger in Haskell?
Domanda
Un modo per calcolare 2 ^ 8 in Haskell è quello di scrivere
product(replicate 8 2)
Quando si cerca di creare una funzione per questo, definito come segue ...
power1 :: Integer → Integer → Integer
power1 n k | k < 0 = error errorText
power1 n 0 = 1
power1 n k = product(replicate k n)
ottengo il seguente errore:
Couldn't match expected type 'Int' against inferred type 'Integer'
La mia ipotesi è che devo usare la funzione fromInteger da qualche parte ... Non sono solo sicuro di dove o come? È un interfaccia o ciò che è fromInteger, e come devo usarlo?
Grazie
Soluzione
In primo luogo, non usare mai fromInteger. Usa fromIntegral.
Si può vedere dove l'errore tipo è guardando il tipo di replica:
replicate :: Int -> a -> [a]
in modo che quando si GIV e 'k' come argomento, che hai affermavi è un numero intero tramite la dichiarazione del tipo, abbiamo un errore di tipo.
Un approccio migliore per questo sarebbe quella di utilizzare genericReplicate:
genericReplicate :: (Integral i) => i -> a -> [a]
E allora:
power1 n k = product (genericReplicate k n)
Altri suggerimenti
Forse una soluzione più semplice è quella di cambiare definizione del tipo della funzione di:
power1 :: Integer -> Int -> Integer
Si dovrebbe guardare il resto del messaggio di errore così, ti dice esattamente la risposta alla tua domanda:
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)
"Nel primo argomento di replicare". Questo è il posto giusto per aggiungere il fromIntegral
.