2011-05-04 79 views
2

這是一個非常愚蠢的問題,但我有點失落。這裏的功能在整數類型之間轉換

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) 

我要補充,使其工作的錯誤?

回答

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類型類的實例,因此,你不能直接用就可以了(**) 。您可以轉換爲某種浮點類型並返回,但這裏最好直接使用整數版本。另請注意,(^)只需要指數就是不可或缺的。該基地可以是任何數字類型。

相關問題