在整数类型之间转换

时间:2011-05-04 08:01:19

标签: haskell floating-point int typeclass

这是一个非常愚蠢的问题,但我有点失落。这是函数

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 个答案:

答案 0 :(得分:7)

(**)是浮点指数。您可能希望使用(^)代替。

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类型类的实例,因此您无法直接在其上使用(**)。您可以转换为某种浮点类型并返回,但在这里最好直接使用整数版本。另请注意,(^)仅要求指数为整数。基数可以是任何数字类型。