2014-10-14 3 views
0

제목에서 설명한대로 각 짝수 및 홀수를 해당 값으로 변환 할 수 있지만 입력 한 데이터는 쉼표가 붙었 어. 어떤 추가 L[] 만듭니다. 제게 기대되는 결과를 보여 드리겠습니다.목록 내의 짝수를 1로, 0을 내기 위해 확률을 변환하십시오. 쉼표로 버그를 작성하십시오.

예상 결과>binariza (L [E 1,L [E 2,E 3],E 4]) => L [E 0,L [E 1,E 0],E 1]

내 결과>binariza (L [E 1,L [E 2,E 3],E 4]) => L [E 0,L [L [E 1,L [E 0,L []]],L [E 1,L []]]]

여기 내 코드는 사람이 어떻게 L[]에 쉼표가 발견 될 때마다 모든 캡슐화 방지하는 나를 설명 할 수있다.

data LA e = L [LA e] | E e deriving Show 

binariza :: LA Integer -> LA Integer 
binariza (L[]) = L[] 
binariza (E num) = 
    if (even num) then 
     E 1 
     else 
      E 0 
binariza (L (x:resto)) = 
    L [(binariza x), (binariza (L resto))] 

참고 : 내 솔루션은 재귀 적이어야합니다.

답변

5

기억하십시오. [a,b,c,d]a:b:c:d:[] ...의 줄임말입니다. 따라서 추가 []은 여분의 빈 배열에서 나옵니다.

을 배열 내의 각 요소에 매핑하면 map을 사용하여 수행 할 수 있습니다.

"내 솔루션은 재귀 여야합니다."= "숙제입니다."실제 줄을 표시하지 않지만 위의 함수에서 마지막 사례를 쉽게 다시 작성하여 map을 사용하고 정답.

+0

감사합니다. @jamshidh! 나는 조언이나 설명만을 찾고 있었다. 제가 질문을 가지고 있지만지도를 사용하면 재귀 적으로 만들지 않을 것입니다. "map (짝수 또는 홀수이면 값을 0 또는 1로 바꿉니다.) L [...]". 당신이 나를 안내 할 수 있다면 어떻게 재귀가 될 수 있겠습니까 –

+0

binariza는 binariza를 호출하기 때문에 재귀 적입니다. 요점은 binariza가 트리 아래까지 계속 적용된다는 것입니다. 위의 마지막 경우를 변경하면 재귀는 여전히 매우 명확합니다. – jamshidh

+0

이 오류가 계속 발생합니다. "예상 유형 'LA Integer' '[LA Integer]'실제 유형과 일치 할 수 없습니다." " 처음에는 "맵 함수 목록"을 존중하고 있었지만 맵을 어디에 두 었는지에 따라이 오류가 발생했습니다. "실제 유형 'LA Integer'로 예상되는 유형 '[LA Integer]'와 일치 할 수 없습니다. 당신은 왜 설명해 주시겠습니까 –