2012-12-05 2 views
1

나는 하스켈을 배우고 있지만 간단한 운동을 해결하는 데 문제가 있습니다.하스켈에서 간단한 연관지도를 구현하는이 기간에

나 자신을 연습하기 위해 간단한 연관지도 데이터 구조를 작성하고 싶습니다.

내가 지금까지 작성한 코드입니다 :
-- It represents a simple ordered couple in the form (key, value) 
data Element a b = Element (a, b) 
    deriving (Show) 

-- It represents a (unordered) list of elements in the form (key, value) 
data Dictionary a b = Dictionary [Element a b] 
    deriving (Show) 

-- It represents a simple dictionary which will be used for my tests 
t :: Dictionary Char Int 
t = Dictionary [Element ('a', 1), Element ('b', 2), Element ('a', 3)] 

지금 내가 형태로 부부의 목록을 반환하는 간단한 방법을 쓰기 위해 노력하고 있어요 (A, B). 나는 스스로를 연습하고 다른 방법 (찾기 등)에 유용한 간단한 기능을 제공하기 위해 그것을하고있다.

나는이 코드 조각을 작성한하지만 난 그게 잘못 알고

couples :: Dictionary a b -> [(a, b)] 
couples (Dictionary t) = [(k , v) | (k, v) <- t] 

문제는 분명히 "t"는 부부의 목록이되지 않는 것입니다 : 그것은으로 구성되어 요소 목록으로 구성되어있어 형식 생성자 "Element"다음에 순서쌍이옵니다.

"Element"형식 생성자를 "제거"할 수 있습니까? 나는 모른다 ...

미리 감사드립니다.

+0

그냥 제쳐두고, 그것은 "튜플"이라고 부르지 만 커플은 아니지만 발음은 커플과 운율을 붙입니다. 질질 끌기 위해 노력하지는 않지만 혼란을 피할 수 있습니다. – RonaldBarzell

+0

구현에 어느 정도의 여유가 있습니까? 나는 이것을하는 더 쉬운 방법이 있다고 생각한다. – RonaldBarzell

+0

연습하고 싶지만 단지 참고 사항 : Data.List에는 이미 이것을 수행하는 lookup :: Eq k => k -> [(k, v)] -> Maybe v' 함수가 있습니다. –

답변

4

패턴 일치에 Element 생성자를 추가하기 만하면됩니다.

couples :: Dictionary a b -> [(a, b)] 
couples (Dictionary t) = [(k , v) | (Element (k, v)) <- t] 
+0

고마워. 방정식의 왼쪽 부분에서 패턴 매칭을 할 수 있다고 생각했습니다. 나는 이런 종류의 일들을해야한다. – JohnQ

+0

@ JohnQ 질문에 대한 답변을 Dirk의 대답으로 받아 들여야합니다. – jozefg

+0

예, 물론입니다! StackOverflow에 대한 많은 경험이 없습니다. 지금은 대답으로 받아 들였습니다 :) – JohnQ