2012-05-04 4 views
3

목록 목록 내에서 주어진 요소의 어커런스를 제거하는이 함수가 있습니다.목록 목록 내에서 주어진 요소를 제거합니다.

remove y ls = [f|l <- ls, let f = filter (/= y) l] 

괜찮을한다 :

remove   :: Eq a => a -> [[a]] -> [[a]] 
remove y [] = error "Can't remove an element from an empty list" 
remove y xs = map (filter(/=y)) xs 

어떻게

내가의 라인을 따라 뭔가를 생각

+0

예를 들어'y [] '를 제거하면 오류가납니다. 'remove y [[]]'와'remove y [[y + 1]]'는 에러가 아닌가? – dave4420

+0

감사합니다. 그 에로스를 추가 할 것입니다. 감사합니다. :) – Moe

+5

@Mike : 오류를 범하지 말아야합니다. 빈리스트에서'y'를 제거하면, 그것은 빈리스트로 남습니다 ... 함수는이 경우 총합이어야하며, 에러는 사용하기가 더 어려워 질뿐입니다. –

답변

5

, 결과리스트에 추가 filter (/= xs) l. xss에서 각 xxs에서 각 xs를 들어 , y에서이 다르다 경우에만 x을 유지 :

remove y xss = [ [x| x <- xs, x /= y] | xs <- xss] 

그냥 연습하는 경우 그것은 OK,하지만 map와 버전이 더 나은 방법입니다 :)

2

감사합니다 같은 사용 목록 이해를 할 수있을 것입니다.

기본적으로 모든 바인딩에 대해 l 목록에서 ls을 만들 수 있으며 필터링 된 목록 f을 결과 목록에 추가 할 수 있습니다. 지능형 중첩하여 필터를 제거

remove y xs = [filter (/= y) l | l <- xs] 

또는 : xsl 들어

+0

정말 고마워요. 물어 보는 게 너무 많지 않다면 간단히 설명 할 수 있습니다. – Moe

+0

@ 마이크 : 리카르도의 답변을 참조하십시오.] – m09

+0

@ 마이크 : 짧은 설명을 추가했습니다. – m09

관련 문제