2012-10-07 2 views
2

나는 목록에있는 2 개의 동일하고 연속적인 숫자가 있고 목록에 숫자 x가있는 경우 그 함수를 가지고있다. x를 0으로 변경하고 목록을 반환하고 싶습니다.Haskell : List Comprehension

twoAdjThenThirdZero (x:y:xs) = [if x == y && x `elem` xs then 0 else x | x <- xs] 

어떤 이유로 나는 그것을 실행할 때마다 목록의 처음 두 요소를 생략합니다. 또한, 상기 케이스 싶습니다 것과 반대를하고

*Main> twoAdjThenThirdZero [2,3,4,1,2,0,2,3,3] 

[4,1,2,0,2,0,0]

. 목록의 끝에 두 개의 3을 유지하고 그 두 번째 요소 인 3을 0으로 만들고 싶습니다.하지만 전환되었습니다.

*Main> twoAdjThenThirdZero [2,2,3,1,2,4] 

이 왜 [3,1,0,4]

사람이 알고 있나요? 미리 감사드립니다!

+1

그건 (: 예 : X XS)는'당신'기대 x'하고있어'y'가 하나가 될하기 실제로 목록의 요소는 처음 두 가지 일뿐입니다. 나는 너의 목표를 이해하지 못한다. '[2,1,2,1,2,2,1,1,2,1,2,1]'의 결과물로 무엇을 원합니까? – AndrewC

+0

...'[1,1,1,1]'의 결과로 기대할 수있는 것은 무엇입니까? – phynfo

+0

답변 해 주셔서 감사합니다. [2,1,2,1,2,2,1,1,2,1,2,1]의 경우 [0000221100 , 0,0]. 목록에 다른 번호의 쌍이 있으면 격리 된 번호는 0이어야합니다. – user1670032

답변

1

여기에 여러 가지 문제가 있습니다. 먼저 함수 선언 twoAdjThenThirdZero (x:y:xs)에서 매개 변수 목록을 소멸시켜야합니다. 각 단계마다 x와 y를 계속 받으려면 재귀해야합니다. 대신 당신은 목록 이해력과 x의 복제본을 사용하는 것으로 전환합니다. 목록 이해에서 xs를 살펴 봅니다. xs는 처음 두 (x와 y)를 제외한 함수 매개 변수의 모든 요소입니다.

당신이 큰 소리로 밖으로 목록의 독해를 읽으면 나는 당신이 그것을 이해할 수 있다고 생각합니다.

"x가 y와 같고 x가 xs의 요소이면 0 이외의 x, xs의 모든 x에 대해"입니다. 하지만 x + y + xs의 모든 x에 대해이 작업을 수행하기를 원합니다! 함수 인자의 파괴와리스트 이해의 변수로 두 가지 방법으로 "x"라는 이름을 사용하고 있습니다.

편집 :

이제 무엇을 의미하는지 봅니다. 이미 가지고있는 것에 명시 적 재귀를 추가하면됩니다.

twoAdjThenThirdZero [] = [] 
twoAdjThenThirdZero [x] = [x] 
twoAdjThenThirdZero (x:y:xs) 
    | x == y && x `elem` xs = x : y : twoAdjThenThirdZero [if z == x then 0 else z | z <- xs] 
    | otherwise    = x : twoAdjThenThirdZero (y:xs) 

나는 너에게 의미가 있기를 희망한다. 그렇지 않다면 나는 더 설명하려고 노력할 것이다.

편집 :

phynfo 내가 쓰고 있었는지의 약간 간단한 버전을 올렸습니다!

+0

답변 해 주셔서 감사합니다. [2,2,3,2]는 [2,2,3,0]이됩니다. – user1670032

+0

@ user1670032 updated –

+0

코멘트의 예에서 질문에 이르기까지, 그는 y를 계속 지키고 싶어한다. –

2

이 시도 :

adjToZero = adjToZero' (allDoubles xs) 

adjToZero' ds [] = [] 
adjToZero' ds [x] = [x] 
adjToZero' ds (x:y:xs) = if (x/=y) && (x `elem` ds) then 0:(adjToZero' ds (y:xs)) 
                else x:(adjToZero' ds (y:xs)) 

allDoubles [] = [] 
allDoubles (x:y:xs) = if (x==y) then x:(allDoubles xs) 
           else allDoubles (y:xs) 

예 : 사용할 때 '때문에

> adjToZero [1,2,1,1] 
[0,2,1,1]