2017-10-17 4 views
-2

2-tuples의 목록을 가지고 있고 True에 해당하는 튜플을 반환하는 함수를 구현하려고합니다. 첫 번째 문자는 문자열이고 두 번째 문자는 부울입니다. 여기 튜플 패턴 매칭리스트 하스켈

pack [ ("a", True), ("b", False), ("c", False), ("d", True) ] 
     returns [ ("a", True), ("d", True) ] 

내 코드입니다 : 이것은 내가 원하는 것입니다 나는 단지 {반환 [("A", 참), ("D", 진정한)]를} 얻을 수

pack :: [String] -> [Bool] -> [(String, Bool)] 
pack [] [] = [] 
pack (x:xs) [] = [] 
pack [] (y:ys) = [] 
pack (x:xs) (True:ys) = (x, True) : pack xs ys 
pack (x:xs) (False:ys) = pack xs ys 

pack ["a", "b", "c", "d"] [True, False, False, True] 

으로 입력하면됩니다.이 방법은 내가 원하는 것이 아니며이 방법에 대해 혼란 스럽습니다. 도움, 안내 또는 링크를 많이 주시면 감사하겠습니다.

+0

사용'팩 = 필터가 나는 그것을 사용하는 사랑 4castle @ – 4castle

+0

을 snd',하지만 난이 일을 시도하고있다 하스켈 함수를 사용하지 않고 – legoniko

답변

2

솔루션을 향한 내 단계가 무엇인지 보여주기 위해 구현하려는 설명을 사용하겠습니다. 다행히도 미래의 솔루션에 집중할 수 있기를 바랍니다.

입니다

pack :: [(String, Bool)] -> [(String, Bool)]

, 당신이 2 튜플 (A String되는 첫 번째 요소가 두 번째 요소가되는 목록을 가지고 : 나는 그것을 바꿔 경우

, 당신은 다음과 같은 서명 기능을 원하는 a Bool) 그리고 같은 유형의 목록으로 끝내고 싶습니다.

필터이 목록의 모든 튜플은 True 값으로 유지하면됩니다. 전주곡 그냥하는 기능을 가지고 발생합니다

filter :: (a -> Bool) -> [a] -> [a]

첫 번째 filter의 인수하는 조건라는 a -> Bool 기능, 당신은 당신이 (두 번째 인수의 첫 번째를 유지하려면 무엇을 정의 할 수 있습니다 [a]). a 전혀 어떤 유형이 될 수 있습니다, 그래서 우리는 (String, Bool)a을 대체 할 수 및 filter는 다음과 같은 유형이 것이

참고 :

filter :: ((String, Bool) -> Bool) -> [(String, Bool)] -> [(String, Bool)]

우리의 목표 서명에 점점 더 가까이 보이기 시작이야 pack!

pack :: [(String, Bool)] -> [(String, Bool)] 
pack = filter onlyTrue 

당신이 언급 한 : 마지막으로, 우리는 filterisTrue의 관점에서 pack을 구현할 수

isTrue :: (String, Bool) -> Bool 
isTrue (_, True) = True 
isTrue (_, False) = False 

을 : 우리가 누락 것은 우리가 유지하고 싶은 filter을 말할 것이다 술어 (String, Bool) -> Bool입니다 "내장"함수를 사용하지 않으려는 주석입니다. 의 다음 filter을 제거하자, 당신이 게시 한 원래의 스타일 pack 가까이 쓰기 :

pack [] = [] 
pack (x:xs) 
    | isTrue x = x : pack xs 
    | otherwise = pack xs