2010-07-25 5 views
16

하스켈 코드를 사용하여리스트를 변경하려고합니다. 필자는 필요한 모든 것을 이해하고 있다고 생각합니다. 그러나 세트에서 패턴을 일치시키는 방법을 모르겠습니다. 리스트에는 Set 생성자로 에뮬레이트하기 어려운 멋진 리터럴 구문이 있습니다. 예를 들어 다음과 같은 코드가있을 수 있습니다.빈 세트의 하스켈 패턴 매칭

foo [] = [] 
foo x = other_thing 

목록 대신 집합을 사용하도록이 코드를 작성하려면 어떻게해야합니까?

답변

30

글쎄, 그렇지 않을 수도 있습니다.

Set는 인 추상 자료형[0] 의도적 주로 타입 시스템 (즉, 표준 라이브러리에서 정적으로 적용 할 수없는 데이터 구조의 불변을 유지하기 위해, 내부 표현을 숨기는Data.Set.Set은 2 진 탐색 트리입니다.

추상적 인 데이터 유형에 패턴 매치하는 기능을 잃어 버리는 것은 부수적 인 손상의 불쾌한 비트이지만, 오 잘. 옵션은 대략 다음과 같습니다.

  • 부울 조건 및 가드를 사용하십시오. null, trinithis의 대답과 마찬가지입니다.
  • Set을 목록으로 변환하십시오. 대부분의 경우 이것은 어리석은 일이지만 어쨌든 세트를 반복하고 싶다면 충분히 잘 작동합니다.
  • GHC's ViewPatterns extension을 사용하도록 설정하면 패턴 일치가 정상적으로 이루어지는 접근 자 함수를 사용하기위한 구문 설탕을 제공합니다.
  • 처음에는 이러한 종류의 수표를 사용하지 마십시오. 인 경우 세트를으로 설정하고 매핑, 필터링 등을 위해 전체적으로 작업하십시오. 항상 가능하지는 않지만 발생할 수 있습니다 적은 수의 명시 적 조건문/반복을 사용하여 코드를보다 명확하게 처리 할 수 ​​있습니다.

보기 패턴이 보이는 뭔가를 쓸 수 것 : setView은 당신이 쓰는 기능이

foo (setView -> EmptySet) = [] 
foo (setView -> NonEmpty set) = other_thing 

.... 정말 여기 이득의 많은,하지만 더 복잡한 의사 패턴

명시 적 검사를 피하기 위해, 게다가 잘 알려진 일련의 작업은 unionintersection로의 사용을 고려하기위한 좋은 수 있습니다 아니 filter, partition, map, 및 foldData.Set에서 기능합니다.

[0] : 내가 사용하고있는 용어의 정의는 this paper (경고 : PDF)을 참조하십시오.

+0

+1 ViewPatterns 참조! – ShiDoiSi

29
import qualified Data.Set as Set 

foo set 
    | Set.null set = bar 
    | otherwise = baz 
+1

+1 간단 대답 –

+7

@ simonjpascoe : 잠깐, 우리는 * 간단한 * 답변을 줄 수 있습니까? 그리고이 모든 시간에 나는 3 단락의 최소값이 있다고 생각했습니다 ... –