2009-10-24 4 views
7

하스켈을 처음 접하면 장애물이 있습니다. 첫 번째 항목을 기반으로 튜플 목록을 필터링하려고합니다. 튜플 목록 필터링

filter (==(x,_)) lis 

나는 불법 '_'오류,하지만 난 그것을 극복하는 방법을 모르겠어요?

답변

19

하스켈에서는 목록처럼 튜플을 반복 할 수 없습니다.

튜플에 두 개의 항목 만있는 경우 fst을 사용하여 튜플의 첫 번째 항목을 검색하고 snd을 사용하여 두 번째 항목을 검색 할 수 있습니다. 나는 당신이 원하는 무슨 생각을 할 수

한 가지 방법은이 방법이다 : 첫 번째 요소는 1로 동일 목록의 항목을 반환

Prelude> let lst = [(1,2), (3,4)] 
Prelude> filter ((==1).fst) lst 
[(1,2)] 

; 물론, 당신은 다음 fst의 결과에 (==1)을 적용, LST의 요소에 fst를 적용 처음에는 1

좀 더 구체적으로 넣어 x, (==1).fst을 대체 할 수 있습니다 - 기술적 점은 를 구성 두 기능은 함께 작동합니다.

+0

정말 고마워. 그것들이 모든 샘플 코드에서 무엇을하고 있었는지 궁금합니다. – Zippy

+0

'.'과'$ '의 사용법은 하스켈을 시작하는 데있어 가장 일반적인 장애물 중 하나라고 생각합니다. 걱정하지 마세요. 문제가있는 사람은 당신 만이 아닙니다! –

5

== 연산자 (또는 다른 함수)에 와일드 카드 _을 포함 할 수 없습니다. 인수는 일치해야하는 패턴이 아닌 실제 값이어야합니다.

당신은 당신 filter 조건으로 람다 기능을 사용할 수있는 패턴 매칭을 사용할 경우

filter (\(a,_) -> a == x) lis 

또한, 두 원소 투플의 첫번째 요소를 추출하기 위해 소정의 기능 fst있다. 이것은 ==과 결합하여 동일한 테스트를 수행 할 수 있습니다.

filter ((== x) . fst)) lis