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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top