2017-12-09 19 views
0

私は、件名と平日のリストを持っています。ハスケル:組み合わせ(リストのリスト)

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

ここでは、組み合わせのリストを生成したいと思います。 結果は次のようになります。

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

誰も私が上記の結果を生成するためにハスケルで関数を記述するために助けてくださいもらえますか?

ありがとうございます。

+1

おそらく、有効な日数ではない無限数の文字列があります会うためにお尻。代わりに、より具体的な型を使用してください: 'data ClassDay = Mon | Tue |水|木|金; 'subjectDays :: [(String、[ClassDay])]; subjectDays = [( "数学"、[月、火])、( "科学"、[月、水])]。 – chepner

+0

@chepnerはい、そうです。プログラムをデータ型で更新しました。ありがとうございました。 –

答えて

4

以下のコメントから、最初に理解した出力以外の出力がほしいと思っています。

基本的に、それぞれのサブリストに各サブジェクト(正確に1回)が含まれ、そのサブジェクトの1つの日とペアにしたいとします。下に定義されたcombinations( "間違った"出力)を取っても、combinationsのすべてのリストの "デカルト積"を取りたいと思っています。このデカルト積はControl.Monad.sequenceを使用して求めることができます。

wantedCombinations = sequence combinations 

ここにヒントがあります。

まず、1組のあなたをリストに展開する関数を作成します。

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

これは、たとえばリストの理解を使用して解決できます。またはmap。その後、我々はリスト

combinations = map combs subjectDays 
+0

'' 'comb(件名、日数)= [(件名、d)| d " - days" '' ' しかし、それは私が期待したものとは異なる結果をもたらします。 ' '' [["" maths "、" mon "]、(" maths "、" tue ")]、[(" science "、" 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 
関連する問題