2011-04-13 5 views
-1

여기 내 질문에, 2 개 튜플 (즉, 쌍)의 목록을 사용하여 카운티 소유 도시를 소유 한 국가에 대한 정보를 나타내는 데이터베이스를 구성해야합니다. 예 : c1은 c4를 소유하고있는 c3을 소유하고 있지만 c1 (등)에 의한 c4의 "간접적 인"소유권은 직접 명시되지 않습니다. 나는 country라는 이름의 두 문자열이 첫 번째가 두 번째를 소유하고 있는지 여부를 나타내는 부울을 반환하는 'owns'함수를 작성해야합니다 (위의 c1과 c4의 경우와 같이 간접적으로). 출력 결과를 기대haskell, 튜플을 사용하여 작은 데이터베이스를 만드는 방법

lst = [("uk","scotland"),("scotland","aberdeen"),("china","hongkong"),("hongkong","kulong")] 
owns :: String-> String -> Bool 
owns a b 
    | n = lookup a (fromList lst) 
     |if b==n 
      return true 
     |otherwise m = lookup n (fromlist lst) 
      if b==m 
      return true 
    | otherwise = False 

메신저과 같이해야합니다 .... 여기 내 코드이야, 내가 도움이 필요 해요, 제발,이 때문에 .... 내가 하스켈 매우 새로운 새, 꽤 괜찮 아니다 알고 :

Main> owns "uk" "scotland" 
True 
Main> owns "uk" "aberdeen" 
True 
Main> owns "uk" "hongkong" 
False 
+0

가능한 중복 [하스켈, 튜플을 비교하는 방법?] (http://stackoverflow.com/questions/5654850/haskell-how-to-compare-tuples) –

+0

'return'은 여러분이 생각하는대로하지 않습니다 : 함수에서 값을 반환하는 대신 하나의 값을 감싸는 데 사용됩니다 (종종 "결과"의 전 계산, 따라서 이름)을 모나드 컨텍스트 (예 :'do' 표기법)로 사용합니다. – Landei

+0

글쎄, 적어도이 질문에 대한 대답은 .... –

답변

1
owns parent child = parent == child || any (owns parent) [p | (p, c) <- lst, c == child] 

당신이 어떻게 작동하는지 알고 싶어합니다.

먼저 이것이 재귀 질문이라는 것을 알고 있습니다. c1 소유 c2 소유 c3 c4 소유 등. 우리는 이것이 얼마나 많은 단계를 취할 수 있는지 알지 못합니다. 그래서 우리는 기본 케이스와 재귀 케이스가 필요합니다.

기본 케이스는 parent == child입니다. 이것이 참이면 전체 답이 참입니다.

이제 재귀 적 사례. any은 함수와 목록을 취하고 목록의 구성원이 함수를 True로 반환하면 True를 반환합니다.

(I 필요한 경우, 나중에 다시이 올 것이다 지금 잠해야합니다.)

+0

thx, 내 문제 해결! – sefirosu

관련 문제