Как использовать fromInteger в Haskell? - PullRequest
4 голосов
/ 02 ноября 2009

Один из способов вычислить 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 ... Я просто не уверен, где и как? Это интерфейс или что от Integer, и как мне его использовать?

Спасибо

Ответы [ 3 ]

11 голосов
/ 02 ноября 2009

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

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

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

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

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

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

Итак:

power1 n k = product (genericReplicate k n)
2 голосов
/ 02 ноября 2009

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

power1 :: Integer -> Int -> Integer
1 голос
/ 04 ноября 2009

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

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.

...