2012-01-17 6 views
2

에 배열 만들기 내가 가진 배열 구성 할 수 있습니다 :하스켈

array ((0,0),(10,10)) [((x,y),(x)) | x<-[0..10], y<-[0..10]] 

을하지만 같은 기능, 간단하지 심지어 뭔가를 만들 수 없습니다

array ((0,0),(10,10)) [((x,y),f(x)) | x<-[0..10], y<-[0..10]] 

잘못 무엇 이?? 구체적으로 어떻게 "x"를 Realfrac로 변환 할 수 있습니까?

- Nevermind에서 function (fromIntegral num) num 대신 function fromIntegral(num) num을 사용하고있었습니다.

답변

3

문제는 당신이 (x*1.5) 말할 때, 당신은 분수로 x을 강요하고 있다는 것입니다 - 같은 플로트, 더블 또는하여 Rational 등을 - (*) 동일한 유형의 두 값을 사용하고 동일한 유형의 값을 반환하기 때문에, 그리고 물론 1.5는 분수입니다.

부동 소수점 숫자로 배열을 만들 수 없기 때문에 문제가 발생합니다. 정수, 정수의 튜플 등이 있습니다. 당신은 아마 할 무엇을 의미 1는 값 계산 x 및 정수로 y하지만, 분수 유형 변환을 유지하는 것입니다 :

array ((0,0),(10,10)) [((x,y), fromIntegral x * 1.5) | x<-[0..10], y<-[0..10]] 
여기

, xy 정수는, 그러나 fromIntegral x입니다 더블. fromIntegral이 무엇 2 모든 민으로 (INT, INT64, 또는 정수와 같은) 임의의 일체형 변환이다 (이 경우, 더블)

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

최종 결과 값 (Integer, Integer) 의해 인덱싱 배열이며 아마도 Double의 타입 일 겁니다. :)

특히 Ix 유형 클래스의 모든 인스턴스가 수행합니다. in the documentation 전체 목록을 볼 수 있습니다. 정수와 더블가 다른 적분 또는 소수보다는 고른 이유에 관해서는

2이 하스켈의 디폴트 메커니즘 때문이다. 기본적으로 프로그램에 모호한 숫자 유형이있는 경우 먼저 Integer를 사용하여 시도한 다음 작동하지 않는 경우 (예 : 형식이 Fractional이어야하므로 Integer가 아닌 것처럼), Double 대신 시도됩니다. 이것은 상당히 자의적이지만 많은 어리석은 곳에서 모호한 부분을 없애는 데 도움이됩니다.

3

인덱스 유형은 Ix 클래스에 속해야합니다. 이해하기 쉬운 이유로 Double 또는 Float과 같은 유형의 인스턴스는 없습니다. 하지만 Fractional 번으로 번식하려고합니다. 인덱스를 적절한 유형 (예 : ((x,y), fromIntegral x * 1.5))으로 변환해야합니다.