2013-05-16 1 views
0

복소수에 대한 데이터 유형을 생성했으며이 데이터 유형에 대해 Num의 인스턴스를 작성하려고합니다. 내 쇼 기능에 필요하기 때문에 negate 줄을 추가하려고 시도했지만이 오류가 계속 발생합니다. "negate"는 데이터 생성자가 아닙니다.Num의 인스턴스를 생성 할 때 부정으로 오류가 발생했습니다.

instance Num Complex where 
    (C u v) + (C x y) = (C (u+x) (v+y)) 
    (C u v) * (C x y) = (C (u*x) (-v*y)) + (C (v*x) (u*y)) 
    (C u v) - (C x y) = (C (u+(-x)) (v+(-y))) 
    negate 
    abs  (C x y) = C (root (x*x + y*y)) 0 
    signum (C x y) = if (x==0 && y==0) then 0 else 1 
    fromInteger n = C (fromInteger n) 0 

가 무효화 라인에 어떤 도움 충전이 크게 감상 할 수있다 : 여기

은 인스턴스에 대한 코드입니다.

+0

negate :: Num a => a -> a'는 인수의 '음수'값을 반환합니다. 어떻게 복소수를 무효화합니까? 즉,'x + iy'를 가지고 있다면'u'와'v'의 값은'x + iy + u + iv = 0' 일 필요가 있습니까? –

+1

몇 가지주의 사항 :'u + (- x)'대신'u-x' 만 쓰는게 어떨까요? 곱셈은 ​​조금 더 조밀하게 쓰여질 수도 있습니다. - '내 쇼 기능에 필수적이기 때문에 부정 라인을 추가하려고했습니다.'- 당신이 의미하는 바를 모르겠지만 뭔가 잘못 생각한 것 같습니다. 쇼 기능과 관련이있는 것은 무엇입니까? -'signum' (일반적으로 복소수에 대해서는 정의되지 않음)은 다른 모든 함수와 마찬가지로 실수로 축소 될 때 실제 버전과 동일해야합니다. 즉,'signum (-π)'은'- 1 '이 아니라 1입니다. – leftaroundabout

+0

@leftaroundabout 나는이 비트들을 정리할 것입니다. 처음에 그것을 썼습니다. 더 좋은 방법으로 복소수를 출력하는 쇼 함수를 작성했습니다. 예 : 내가 일하려고하는 선은'show (C a (-b)) = "("++ show a ++ "-"++ show b ++ "i)"'이 물건의 이유는 궁극적으로 복소수의 다항식을 풀 수 있습니다. – edept

답변

4

나는 이것을 학습 운동으로 생각하고 있습니다. 그렇지 않으면 단순히 use Data.Complex일까요?

답변을 제공하는 대신 I shall answer your question by asking you another question.

negate {-something-} = {-something-} 

"무언가"중 무엇인가를 채울 수 있습니까? 그 중 하나를 완벽하게 채울 수 없다면, 공정하게 충분하지만, 채워야 할 나머지 간격이 어디에 있는지 알 수 있도록 깨끗하게하십시오.

Btw, 귀하의 정의는 signum입니다. (모두 z에 대해 abs z * signum z = z이 있어야합니다.)

+0

답장을 보내 주셔서 감사합니다. 글쎄, 이런 식으로 간단하다고 생각했습니다. : negate (Cx y) = (C (-x) (-y))'. 아마 당신은 오류를 설명 할 수 있습니다. "negate"는 데이터 생성자가 아닙니다. winhugs에서 얻을 수있는 유일한 피드백이며 특히 도움이되지 않습니다. 또한 내 쇼 기능의 줄을 메모하는 것이 유용 할 것입니다 :'show (C a (-b)) = "("++ show a ++ "-"++ show b ++ "i)"'. 내가 부정을 추가하는 이유는이 시나리오에서 b를 보여줄 수 있다는 것입니다. – edept

+2

@ user2385741'show' 함수는 문제가있는 곳입니다 :'-'를 사용하여 패턴 일치를 할 수 없습니다. '(-foo)'는'(negate foo)'에 desugars됩니다 (예, 이것은 다른 모든 Haskell 연산자와 다릅니다). 그 방정식을'show (C a b) | b <0 = "("++ "+ a"+ "+"+ "+"+ "show" – dave4420

+0

지금 정렬, 감사합니다. 도움 감사 – edept

관련 문제