Wie benutze ich von Integer in Haskell?
Frage
Eine Möglichkeit, 2^8 in Haskell zu berechnen, ist das Schreiben
product(replicate 8 2)
Beim Versuch, dafür eine Funktion zu erstellen, definiert wie folgt ...
power1 :: Integer → Integer → Integer
power1 n k | k < 0 = error errorText
power1 n 0 = 1
power1 n k = product(replicate k n)
Ich bekomme den folgenden Fehler:
Couldn't match expected type 'Int' against inferred type 'Integer'
Ich vermute, ich muss die von der Integer -Funktion irgendwo verwenden ... Ich bin mir einfach nicht sicher, wo oder wie? Ist es eine Schnittstelle oder was ist von Integer und wie soll ich sie verwenden?
Vielen Dank
Lösung
Verwenden Sie zunächst niemals von Integer. Verwenden Sie von Integral.
Sie können sehen, wo sich der Typfehler befindet, indem Sie den Replikattyp betrachten:
replicate :: Int -> a -> [a]
Wenn Sie es also als Argument als "k" givieren, von dem Sie behauptet haben, dass es eine Ganzzahl über die Typdeklaration ist, haben wir einen Typfehler.
Ein besserer Ansatz dafür wäre die Verwendung von GenericReplicate:
genericReplicate :: (Integral i) => i -> a -> [a]
Also dann:
power1 n k = product (genericReplicate k n)
Andere Tipps
Vielleicht besteht eine einfachere Lösung darin, die Typ -Definition der Funktion zu ändern auf:
power1 :: Integer -> Int -> Integer
Sie sollten sich auch den Rest der Fehlermeldung ansehen. Sie erfahren genau die Antwort auf Ihre Frage:
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)
"Im ersten Argument der Replikate". Das ist der richtige Ort, um das hinzuzufügen fromIntegral
.