2011-05-04 2 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 

오류 메시지가 IntFloating typeclass의 인스턴스가 아닌 사실을 말하고, 따라서 당신은 직접에 (**)을 사용할 수 없습니다 . 어떤 부동 소수점 유형으로 변환 할 수 있지만 여기에서는 정수 버전을 직접 사용하는 것이 좋습니다. 또한 (^)지수 만 필수적입니다. 기본은 모든 숫자 유형이 될 수 있습니다.