2016-10-30 3 views

답변

1

은 일반적인 경우를 해결하기 위해 만족하는 사람을 선택 ((==) `on` fst)으로이 조건을 만족 쌍에서 튜플의 두 목록을 비교하는 것입니다 두 술어가 들어있는 튜플을 패턴 매치하고 두 술어가 만족되는지 검사합니다. 첫 번째 조건 odd 두 번째 술어 목록 [(1,2),(2,2),(3,3),(3,4)]을 평가하는 것

filter' :: ((a->Bool),(a->Bool)) -> [(a,a)] -> [(a,a)] 
filter' (pred1,pred2) = foldr f [] 
where f = (\x acc -> if pred1 $ fst x then 
             if pred2 $ snd x then x : acc 
             else acc 
         else acc 
      ) 

even 같이

>> filter' (odd,even) [(1,2),(2,2),(3,3),(3,4)] 
[(1,2),(3,4)] 
+2

'(++)'로 단일 요소를 추가하여'foldl'을 사용하여 목록을 재구성하는 것은 좋은 생각이 아닙니다. 대신'foldr'와'(:)'를 사용하십시오. 또한 모든 것을 다시 구현할 필요가 없습니다. 'filter '를'filter'와 같은 것으로 재사용 할 수 있습니다. p q = filter (uncurry (&&) .bimap p q)'. – duplode

+0

좋은 지적. 포함 된 내용이 더 낫고/더 간결하지만, 'foldr'을 사용하도록 구현 된 것을 변경했습니다. – mnoronha

+0

당신이 사용하고있는'bimap' 함수는 무엇입니까? – mnoronha

2

그 가정 것이다 ... 내가하려고 어떤

을 두 개의 튜플 목록을 비교하는 것입니다. ((==) `on` fst)

... 목록의 경우 일반적으로 (==)에서와 같이 한 목록의 각 쌍을 다른 목록의 해당 쌍과 비교하는 것을 의미합니다. minBy'를 작성하는 다른 방법에 대한

-- Suggestions of sensible names for this are welcome. 
yourSelector :: (Eq a, Ord b) => [(a, b)] -> [(a, b)] -> [(a, b)] 
yourSelector ps = fmap (minBy' snd) 
    . filter (uncurry ((==) `on` fst)) . zip ps 
    where 
    minBy' f (x, y) = case (compare `on` f) x y of 
     LT -> x 
     _ -> y 
GHCi> yourSelector [(1,2),(3,5),(4,7)] [(1,3),(2,2),(4,9)] 
[(1,2),(4,7)] 

, 참조 : 여기

는 원래의 제안에 가깝게 유지 주로 pointfree (그리고 아마도 약간 불안) 솔루션입니다 Maximizing according to a function.

관련 문제