2014-07-19 5 views
-1

첫 번째 요소 또는 두 번째 또는 세 번째를 기준으로 튜플을 검색하려면 어떻게해야합니까?두 개 이상의 튜플을 통해 검색

두 튜플을 찾는 방법을 알고 있지만 두 개 이상의 튜플을 검색하려면 어떻게해야합니까?

type Stuff = (String, String, Int) 

testStuff :: [Stuff] 
testStuff = [ 
    ("beans","black",5), 
    ("cod","fish",4), 
    ("coke","diet",3) 
] 

어떻게 "Stuff"를 검색하고 "int"값을 반환하는 함수를 작성할 수 있습니까?

예컨대 searchStuff "콩"5

+4

음 ... 지금까지 시도한 것은 무엇입니까? 쌍만있을 때 찾을 수있는 해결책은 무엇입니까? 두 경우의 차이점이별로 없다는 것을 알게 될 것입니다. – Cubic

+0

동일한 필터 + 패턴 일치 – 0xAX

답변

7

검색 목록에 검색 기능을 제공하지 않았으므로 lookup을 사용했다고 가정합니다. 새로운 기능을 위해 find에 집중하십시오. findData.List (그리고 Data.Foldable에서보다 일반적인 버전)에서 찾을 수 있으며, 다음과 같은 유형이 될 수있다 : 당신이 첫 번째 요소를 기반으로 트리플 목록에서 뭔가를 찾을 필요가 있다면, 당신은 사용할 수 있습니다, 지금

find :: (a -> Bool) -> [a] -> Maybe a 

find (\(a,_,_) -> a == "beans") testStuff 

그러나 이로 인해 Maybe Stuff이 남습니다. 그러나 MaybeFunctor의 인스턴스이므로 Maybe Int으로 결과를 변경하기가 쉽습니다 (연습으로 남음).

2

The Prelude defines lookup to handle searching a list of pairs를 반환해야합니다. 정의는 다음과 같습니다.

-- | 'lookup' @key [email protected] looks up a key in an association list. 
lookup     :: (Eq a) => a -> [(a,b)] -> Maybe b 
lookup _key []   = Nothing 
lookup key ((x,y):xys) 
    | key == x   = Just y 
    | otherwise   = lookup key xys 

트리플 기능 목록을 검색하는 데 어떻게 비슷한 기능을 정의 할 수 있습니까?

관련 문제