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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top