2012-10-01 2 views
2

나는 하스켈에서 정수 인자 c를 취하고 (x/c,y/c) 양식의 직교 평면에있는 모든 점의 목록을 반환하는 함수를 정의하려고합니다. 여기서, xy은 정수입니다. -1에서 1 사이의데카르트 평면

사이 -2 1 y/r x/c이 내가 지금까지 나는 거의 확신하는 얻었다 권리입니다하지만 입력 =에 구문 분석 오류를 받고 있어요 한 내용입니다 때 이 라인에서 특히 실행 : cart xs ys c = [(y/c,x/c) | x <- xs, y <- ys]

plane :: Int -> [a] 
plane c = cart [-1*c .. 1*c] [-2*c .. 1*c] c 
    cart xs ys c = [(y/c,x/c) | x <- xs, y <- ys] 

샘플 출력은 다음과 같습니다 plane 1 생성 것이다 : 나는이 문제를 해결할 수있는 방법을

[(-2.0, -1.0), (-1.0, -1.0), (0.0, -1.0), (1.0, -1.0), 
(-2.0, 0.0), (-1.0, 0.0), (0.0, 0.0), (1.0, 0.0), 
(-2.0, 1.0), (-1.0, 1.0), (0.0, 1.0), (1.0, 1.0)] 

사람이 어떤 생각을 가지고! 감사합니다

답변

4

일부 유형 오류가있는 것 외의 where이 누락되었습니다.

  1. [a]
  2. /
  3. 은 소수 유형에서 작동 너무 일반적이다.

그렇게

plane :: Int -> [(Int,Int)] 
plane c = cart [-1*c .. 1*c] [-2*c .. 1*c] c where 
    cart xs ys c = [(y `div` c,x `div` c) | x <- xs, y <- ys] 

당신이 원하는 수 있습니다. 자신이 가지고있는 것에서 가장 작은 변화가 다소 작용합니다.

+0

@PhilipJF. 나는 가장 작은 오류를 계속합니다. 언젠가는 함수형 프로그래밍을 극복 할 것입니다. – NuNu

+0

'div'는'Integral a => a -> a -> a'이므로 정수 값만 반환하지만 실수 나 합계가 필요합니다. – NovaDenizen

1

이렇게하면됩니다. fromintegralIntegral 유형 클래스의 모든 값을 Num 유형 클래스의 다른 유형으로 변환하는 유형 '글루'기능입니다. / 연산자를 사용하려면 결과 유형이 RealFrac (예 : Double 또는 Rational)이어야합니다.

plane :: (Integral a, RealFrac b) => a -> [(b,b)] 
plane d = [(fI y/fI d,fI x/fI d) | x <- [-2*d..d], y <- [-d..d]] 
    where fI = fromIntegral