2010-12-07 6 views
2

저는 2 개의 Ints n, x를 허용하는 함수를 가지고 floor (log n/log x)를 계산합니다. 여기서 n과 x는 둘 다 매우 제한되어 Int는 나를 위해 충분합니다.하스켈에서 'floor'함수의 유형 오류

No instance for (RealFrac (a -> b)) 
    arising from a use of `floor' at p5_evenly_divide.hs:20:11-63 
Possible fix: add an instance declaration for (RealFrac (a -> b)) 
In the expression: 
    floor (log . fromIntegral n/(log . fromIntegral x)) 
In the definition of `func': 
    func n x = floor (log . fromIntegral n/(log . fromIntegral x)) 

가 어떻게이를 통해 얻을 수 있습니다 :

func :: Int -> Int -> Int
func n x = floor (log . fromIntegral n/(log . fromIntegral x))

그러나 여기가 ghci에서 오류가 온다?

답변

12

표현 log . fromIntegral n은 이 아닌 log . (fromIntegral n)과 같습니다. 이는 아마도 당신이 원했던 것입니다. 단지 log (fromIntegral n)은 아마도 더 읽기 쉽습니다.

일반 교화를 들어

, 당신을 말하고 때 오류 메시지가 No instance for (RealFrac (a -> b))를 말한다 당신의 결과에 함수의 합성 (.)을 적용하고 있기 때문에 수행하려고 분수 숫자와 같은 함수를 사용하는 방법을 알아낼 수 없습니다 fromIntegral n. 이 경우 약간 둔한 것입니다.

+0

난 당신이 두 문제를 설명하는 방법과 문제를 해결하는 방법을 좋아한다. 정말 도움이됩니다. – Chuck

+0

감사합니다. –

+0

RealFrac에서 'floor'가 사용되어야한다는 오류 메시지가 표시되어 잘못된 방향으로 계속 걸었습니다. –

4

이 시도 :

func :: Int -> Int -> Int 
func n x = floor (k n/k x) where 
    k = log . fromIntegral