Как использовать fromInteger в Haskell?
Вопрос
Один из способов вычислить 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
.