2016-07-14 2 views
1

다항식을 나타내는 typeclass의 show 함수에 대한 문자열 표현을 작성하려고합니다. 나는 'Char'에서 '[Char]'로의 불일치가 계속 발생하지만 haskell의 "append"함수는 Char를 문자열/[Char]에 연결할 수 있어야합니다. 문제가있는 곳이나 내가받은 오류를 근거로 솔루션을 찾는 위치를 이해할 수 없습니다. 여기에 결함있는 코드 :오류 예상 유형 'Char'를 실제 유형 '[Char]'과 일치시킬 수 없습니다.

newtype Poly a = P [a] 

instance (Num a, Show a) => Show (Poly a) where 
    show p = ["" : form (p !! i) i | i <- [l,(l-1)..0]] 
     where 
      l = length p 
      form e i 
       | i == 0 = elem 
       | i == 1 = elem ++ "x + " 
       | otherwise = elem ++ "x^" ++ (show i) ++ " + " 
        where elem = show e 

어떤 도움을 주시면 감사하겠습니다. 미리 감사드립니다.

+2

나는 이미 몇 가지 문제를 볼 수 있지만 실제로는 '폴리'정의를 게시해야합니다. – dfeuer

+0

또한 작게 시작해서 길을 가야합니다. 자체 형식 시그니처가있는 최상위 레벨 ('where' 절이 아닌)에'form' 함수를 작성할 수 있습니까? 일단 당신이 그것을하면, 당신은 조금을 만들 수 있습니다 ... – dfeuer

답변

5

당신은 문자열/[샤아]에 숯불을 연결할 수있을 것입니다 내 이해 하스켈의 "추가"기능에서

물품.

나는이 아이디어가 어디 있는지 알지 못합니다. 틀렸어. 난 당신이

type Poly a = [a] 

을 정의한 같은데요과 그 가정에 갈 수 있습니다.

instance (Num a, Show a) => Show (Poly a) where 

잘못되었습니다. Poly동의어입니다. 적절한 일등 클래스 유형 (유형 생성자를 0 개 이상의 유형 변수에 적용)에 대해서만 인스턴스를 선언 할 수 있습니다. 당신은 대신 사용하여

newtype Poly a = Poly {getPoly :: [a]} 

을이 문제를 해결할 수 있지만 당신은 필요에 따라 Poly 데이터 생성자를 풀다/포장해야합니다. 이 권한을 얻은 후에는 Num 제약 조건이 필요하지 않음을 알 수 있습니다.

show p = ["" ++ form (p !! i) i | i <- [(length p)..0]] 

몇 가지 문제가 있습니다. 큰 것은 문자열 (문자 목록)을 정의하는 것이 아니라 문자열 목록을 정의한다는 것입니다. 일반적으로 결과에 concat을 적용하여이 문제를 해결할 수 있습니다. 두 번째는 "" ++ anything이 단지 anything인데, 빈 목록을 다른 목록에 연결하면 아무 것도 수행하지 않기 때문입니다. 세 번째 문제는 당신이 카운트 다운하려고하지만, 당신이 잘못한 것입니다. 그 표기법은 세어 봅니다.

let lp = length p in [lp, (lp-1) .. 0] 

내가 (이 실수 중 일부는 앞의 두 라인에 반복) 바로 볼 수있는 마지막 :

| otherwise = e ++ "x^" ++ i ++ " + " 

를 이제 카운트 다운, 당신은 당신이 카운트 다운 할 것을 제시해야 iInt이고 ++은 목록에만 적용됩니다. 그래서 그것은 효과가 없을 것입니다. 먼저 ishow을 사용하여 문자열로 변환해야합니다. ea이며 show을 사용하여 문자열로 변환해야합니다.

+0

나는이 과제에서 작업을 완료하려고 시도하고 있습니다 : http://www.seas.upenn.edu/~cis194/hw/04-typeclasses.pdf는'newtype Poly a = P [a]'로 시작하는 방법입니다. 처음에 이것을 추가 할 것이고, 이제는 양식 부분을 얻었습니다. 이제는 모두 이해를 돕기 위해 시도하고 있습니다. 귀하의 의견을 주셔서 감사합니다, 지금까지 도움이되었습니다! –

+0

변경 사항을 나타내는 코드도 편집합니다. –

관련 문제