Преобразование между целочисленными типами - PullRequest
2 голосов
/ 04 мая 2011

Это довольно глупый вопрос, но я немного растерялся.Вот функция

f :: (Bool,Int) -> Int
f (True,n) = round (2 ** n)
f (False,n) = 0

А вот ошибка, которую я получаю

No instance for (Floating Int)
  arising from a use of `**'
Possible fix: add an instance declaration for (Floating Int)
In the first argument of `round', namely `(2 ** n)'
In the expression: round (2 ** n)
In an equation for `f': f (True, n) = round (2 ** n)

Что мне добавить, чтобы она работала?

1 Ответ

7 голосов
/ 04 мая 2011

(**) - возведение в степень с плавающей точкой.Вы, вероятно, хотите использовать (^) вместо этого.

f :: (Bool,Int) -> Int
f (True,n)  = 2^n
f (False,n) = 0

Полезно взглянуть на типы:

Prelude> :t (**)
(**) :: Floating a => a -> a -> a
Prelude> :t (^)
(^) :: (Num a, Integral b) => a -> b -> a

Сообщение об ошибке сообщает, что Int не является экземпляром класса типов Floating, и поэтому выне может использовать (**) на нем напрямую.Вы можете конвертировать в некоторый тип с плавающей точкой и обратно, но здесь лучше просто использовать интегральную версию напрямую.Также обратите внимание, что (^) требует, чтобы показатель только был целым.База может быть любого числового типа.

...