Вопрос

Один из способов вычислить 2^8 в Haskell — написать

product(replicate 8 2)

При попытке создать для этого функцию, определяемую следующим образом...

power1 :: Integer →  Integer → Integer
power1 n k | k < 0 = error errorText
power1 n 0 = 1
power1 n k = product(replicate k n)

я получаю следующую ошибку:

Couldn't match expected type 'Int' against inferred type 'Integer'

Я предполагаю, что мне нужно где-то использовать функцию fromInteger...Я просто не знаю, где и как?Это интерфейс или что такое fromInteger и как его использовать?

Спасибо

Это было полезно?

Решение

Во-первых, никогда не используйте fromInteger.Используйте от Integral.

Вы можете увидеть, где находится ошибка типа, посмотрев на тип реплики:

replicate :: Int -> a -> [a]

поэтому, когда вы передаете ему «k» в качестве аргумента, который, как вы утверждаете, является целым числом через объявление типа, мы получаем ошибку типа.

Лучшим подходом для этого было бы использование genericReplication:

genericReplicate :: (Integral i) => i -> a -> [a]

Итак:

power1 n k = product (genericReplicate k n)

Другие советы

Возможно, более простое решение — изменить определение типа функции на:

power1 :: Integer -> Int -> Integer

Вам также следует просмотреть остальную часть сообщения об ошибке, она содержит точный ответ на ваш вопрос:

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)

«В первом аргументе репликации».Это место, куда можно добавить fromIntegral.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top