2017-12-09 1 views
0

나는 주제가 가르쳐지는 과목과 평일의 목록을 가지고있다.하스켈 : 조합 (목록의 목록)

subjectDays = [("maths", ["mon", "tue"]), 
       ("science", ["mon", "wed"])] 

지금은 조합의 목록을 생성하고 싶습니다. 결과는 다음과 같아야합니다.

combinations = [[("maths", "mon"), ("science", "mon")], 
       [("maths", "mon"), ("science", "wed")] 
       -- etc. 
       ] 

사람이 나에게 위의 결과를 생성 하스켈에서 함수를 작성하는 데 도움이 시겠어요?

대단히 감사합니다.

+1

아마도 무한한 수의 문자열이 cl의 유효한 날짜가 아닙니다. 만날 엉덩이. 대신에 다음과 같은 좀 더 구체적인 유형을 사용하십시오 :'data ClassDay = Mon | 화 | 수 | 목 | 금'; subjectDays :: [(String, [ClassDay])]; subjectDays = [("수학", [월, 화]), ("과학", [월, 수])]. – chepner

+0

@chepner 예, 맞습니다. 프로그램을 데이터 유형으로 업데이트했습니다. 고맙습니다. –

답변

4

아래의 설명에서 나는 처음에 이해했던 것보다 다른 출력물을 원합니다.

본질적으로 각 하위 목록에는 해당 요일 중 하나와 쌍을 이루는 각 제목 (정확히 한 번)을 포함해야합니다. 아래에 정의 된대로 combinations을 취하면 ("잘못된"결과) combinations 안에있는 모든 목록의 "데카르트 제품"을 가져 가고 싶다는 것을 알게됩니다. 이 Cartesian 제품은 Control.Monad.sequence을 사용하여 얻을 수 있습니다.

wantedCombinations = sequence combinations 

여기에 힌트입니다.

먼저 한 쌍의 항목을 목록으로 확장하는 함수를 작성하십시오.

combs :: (a,[b]) -> [(a,b)] 
combs (subject, days) = ... 

이것은 예를 들어 목록 이해를 사용하여 해결할 수 있습니다. 또는 map.

다음, 우리는 목록

combinations = map combs subjectDays 
+0

'''comb (주제, 일) = [(주제, d) | '''[[ ""maths ","mon "], ("maths ","tue ")], [("과학 (과학) ","mon "), ("science ","wed ")]''' –

+0

@ kk-dev11 알겠습니다. 위의 편집을 참조하십시오. – chi

+0

우수. 그것은 작동합니다. 대단히 감사합니다;) –

0

쓰기의 각 쌍에 combs을 적용하여 구조 한 쌍 ​​

expand :: (a,[b]) -> [(a,b)] 
expand (x,[]) = [] 
expand (x,(y:ys)) = (x,y): expand (x,ys) 

지도에서 작동하도록 기능을 확장하여 (데이터를 트랜스 포즈를 취할 수 있습니다 .List)

transpose $ map expand subjectDays