2010-02-20 3 views
5

유한 한리스트의 크기를 계산하는 haskell 함수가 있습니다. 나는 값이 실제로 지능의 결합 된 최대 값보다 클 수 있기 때문에 정수로 출력 형식이 필요합니다 (결과가 될 것입니다 -1 출력 유형이 Int 인 경우 정확한 수)하스켈 오류 : 유추 된 타입`Int '에 대해 예상되는 타입'Integer '을 일치시킬 수 없습니다.

size :: a -> Integer 
size a = (maxBound::Int) - (minBound::Int) 

나는 이해 Ints (bounded)와 Integers (unbounded)의 차이점이지만 Int에서 Integer를 만들고 싶습니다. fromInteger와 같은 함수가 있다면, Int를 정수형으로 변환 할 수 있는지 궁금합니다.

+0

'a'를 사용하지 않았습니다. – kennytm

+0

(마지막 질문에 @dons 마지막 질문 :) "유한 한 인트 목록의 크기"란 가능한 모든 인트를 포함하는 목록에있는 숫자 요소를 의미합니까? – MtnViewMark

+0

@KennyTM, 예 알아요 :) 크기 함수는 별도의 하위 형식 (Int, Product of Finites 등)에 오버로드되는 Type Class Finite의 속성이므로 어떤 과부하를 사용할지 결정하는 데 사용됩니다. – Fry

답변

11

당신은 fromIntegral 기능을 수행 할 수있는 정수 (하스켈에 대한 숫자 주조)에 값을 변환해야합니다 : 그것은에서 모든 유형의 적분 클래스의 모든 유형을 변환

fromIntegral :: (Integral a, Num b) => a -> b 

(더 큰) Num 클래스. 예 : 매우 깨지기 보인다 -

fromIntegral (maxBound::Int) - fromIntegral (minBound::Int) 

그러나, 나는 정말 당신이 복용하고있는 접근 방식을 신뢰하지 않을 것입니다. 랩 어라운드를 허용하는 유형이있는 경우의 동작은 꽤 의심 스럽습니다.

"Finite Ints 목록의 크기"는 실제로 무엇을 의미합니까? 목록의 길이가 아닌 경우이 의미에서 크기는 무엇입니까? 내가 당신을 믿지

+0

예, 본질적으로 목록의 길이이지만 유한 목록조차도 커질 수 있습니다. 그래서리스트의 길이를 얻으려면 먼저리스트를 만들고 나서 그것을 중재해야합니다. 이 방법으로 전체 목록을 생성하지 않고 대답을 만들 수 있습니다 :) – Fry

4

이 찾고있는 사람이됩니다

fromIntegral :: (Integral a, Num b) => a -> b 

int로 아마

+0

... 그 반대의 경우도 마찬가지입니다. (int를 정수로 변환하십시오.) – BMeph

0

당신이 가정 한 정수로 변환되는 것을 하스켈, 특정 많은 메인 스트림 C와 같은 언어와 (같은 익스텐트) Java는 암시적인 숫자 형 변환을가집니다. 그렇지 않습니다 : Int와 Integer는 완전히 관련이없는 유형이며, 이들 사이의 변환을위한 특수 함수가 있습니다. fromIntegral. 그것은 Num typeclass에 속합니다. 문서를보십시오 : 본질적으로, 인티그랄은 그 이상을 수행합니다 : 이것은 "임의의 정수의 표현을 구성하는"일반적인 것입니다, t.i. 어떤 종류의 숫자를 구현하고 Num을 인스턴스화하려면 유형의 정수를 구성하는 방법을 제공해야합니다. 예를 들어, 복소수의 Num 인스턴스에서 fromIntegral은 허수 부분이 0이고 실수 부분이 실수 인 복소수를 만듭니다.

Haskell에서 암시 적 숫자 강제 변환이있는 유일한 의미는 정수 리터럴이 오버로드된다는 것입니다. 42를 쓸 때 컴파일러는 "fromIntegral (42 :: Integer)"로 암시 적으로 해석하므로 정수를 사용할 수 있습니다 Num 유형이 필요한 컨텍스트.

+0

Numpicker가되어 미안 합니다만 (Num 클래스 "스택"에 대한 내 오줌 누둥 중 하나를 만지기 때문에 나는 기분이 좋을 것입니다 ...) 그러나'Complex a '타입 클래스가 아닌가? 그러한 "조기 최적화"중 하나입니까?)는 'RealFloat a' 컨텍스트를 가지고 있으며, fromIntegral'd Complex 번호는 필수적인 실수 부분을 갖지 않지만 "Real"부분은 가장 가능성이 큰 Double 부분을 갖습니다. 그 작은 얼간이 이외에, 그것은 꽤 좋은 대답입니다 - 계속하십시오! – BMeph