2009-12-28 5 views
8

하스켈을 배우고 있습니다. 베이스 'b'에서 'n'까지 곱셈 테이블을 반환하는 함수를 만들었습니다. 숫자는 'w'자릿수로 채워집니다. 마지막 단계로서 'w'를 자동으로 계산하고 싶습니다. 왜 이것이 컴파일되지 않습니까?(Floating Int)에 대한 인스턴스가 없습니다.

-- Number of digits needed for the multiplication table n*n in base 'base' 
nOfDg :: Int -> Int-> Int 
nOfDg n base = 1 + floor (logBase base (n*n)) 

오류 :

No instance for (Floating Int) 
    arising from a use of `logBase' at C:\haskel\dgnum.hs:4:24-38 
    Possible fix: add an instance declaration for (Floating Int) 
    In the first argument of `floor', namely `(logBase b (n * n))' 
    In the second argument of `(+)', namely `floor (logBase b (n * n))' 
    In the expression: 1 + floor (logBase b (n * n)) 

답변

10

logBase 부동 typeclass을 구현하는 두 개의 매개 변수를 사용합니다. logBase로 전달하기 전에 매개 변수에서 Integral을 호출해야합니다.

nOfDg :: Int -> Int-> Int 
nOfDg n base = 1 + floor (logBase (fromIntegral base) (fromIntegral (n*n))) 

당신은 하스켈은 매우 강력하게 형식화 된 것을 기억해야합니다, 그래서 당신은 당신의 기능에 공급되는 지능의 매개 변수를 자동으로 부동 번호로 강제 될 것이라고 가정 할 수 없다 :이 6.10.3와 나를 위해 컴파일 그 로그 기능은 일반적으로 필요합니다.

5

logBase은 부동 소수점 유형에서 작동하도록 선언되었습니다. Int는 부동 소수점 유형이 아니며 no automatic conversion in Haskell이 있습니다. 이 시도 :

-- Number of digits needed for the multiplication table n*n in base 'base' 
nOfDg :: Int -> Float -> Int 
nOfDg n base = 1 + floor (logBase base (fromIntegral (n*n))) 
+0

'(fromIntegral base)'도 필요합니다. –

+0

@ Jason : Dan이 그 기능을 부여한 유형이 아니라면 그렇게 할 수 없습니다. – Chuck

+0

네, 사용 방법에 따라 다릅니다. 형식 시그니처를 변경하거나 Andy의 버전을 사용하지 않는 경우에는 그것을 가지고있는 것처럼 할 수 있습니다. –

3

을 서곡에서 :

logBase :: Floating a => a -> a -> a 

그것은 logBase를 사용하면 부동 유형을 사용해야 함을 의미한다. 그러나 지능은 부동 유형이 아니며, 당신이 부동 유형의 지능에서 변환 할 수 있도록 숫자 유형에 대한 자동 변환은 없습니다 다음 toEnum 기능은 매개 변수로 int를 타고 돌아

nOfDg n base = 1 + floor (logBase (toEnum base) (toEnum n)) 

에 " Enum "유형. 좋은 부분은 플로트가 열거의 인스턴스입니다, 그래서 당신은 부동, 숫자 유형 (민, 분수에 대한 하스켈 표준 타입 클래스에 대해 문서화가

toEnum :: Enum a => Int -> a 

당신은/읽어야 적분 사용할 수 있습니다 ...) 종종 코드에서 팝업으로 나타나기 때문에 전환 학습은 유용 할 수 있습니다.

편집 :이 Haskell Wiki Book은 숫자 유형을 포함한 표준 유형 클래스 간의 매우 유용한 그래픽을 제공합니다.

관련 문제