2016-05-13 12 views
0

6要素リスト[x1、x2、x3、x4、x5、x6]のすべての可能な組み合わせを生成したい0と20を返します。6要素リストのすべての組み合わせを生成し、各組み合わせに関数を適用する

このようなリストのすべての可能な組み合わせを生成し、各リストに関数を適用して(入力としてリストを取り込み、魔法のIntを出力する)、その結果をタプルのリストに出力します。すぐそこにあまりにも多くの組み合わせであり、手で行うことは事実上不可能であることに気づいたことで、私は手でこれにしようとした

[([x11,x21,x31,x41,x51,x61],Int1), ([x12,x22,x32,x42,x52,x62],Int2), ...] 

ようなので、タプルのリストが見えます。

組み合わせは、[0,0,0,0,0,0]、[1,7,0,10,11,6]、[7,7,7,7,6,6]、 [20,20,20,20,20,20]など。

(私は前にこれを尋ねたので)私は、リストのすべての組み合わせを生成し、リストのリストにそれらを配置する方法を知っている

foo [] = [[]] 
foo (x:xs) = foo xs ++ map (x:) (foo xs) 

私はこの時間を達成したい私は何をしようとしておりませんので、異なっています特定のリスト内でさまざまな組み合わせを生成するために、私は6つの要素リストをすべて生成しようとしています。

ここ
+0

64000000(20^6)しかありません。どのように「あまりにも多く」ですか?実際の問題に対してもっと賢明なアプローチをとるべきでしょう。これらの魔法のintは何ですか、あなたはそれらで何をしていますか、なぜそれほど多くのものが必要ですか? – Bergi

+0

[List Comprehensions](https://wiki.haskell.org/List_comprehension)のHaskell wikiページの例が参考になると思います。 – ErikR

+0

@Bergiあなたが実際に周囲の文脈を読んでいれば、手で*処理するにはあまりにも多くのことです。 – immibis

答えて

2

私の知る限り、あなたは6つのリスト[0..20]の(ここでは×で示す)デカルト積を求めています。

だから、本質的に、このような何か:

[0..20]×[0..20]×[0..20]×[0..20]×[0..20]×[0..20] 

(85766121は、正確には)要素のたくさんだこと。しかし、それはできます。

おそらくわかりやすいバージョンは次のとおりです。

リストとリストのリストの上に直積のような何かをするだろうこと、cart、私たちは関数を定義してみましょう:

let cart xs ls = [x:l | x <- xs, l <- ls] 

この関数はlsからxsからすべての要素、およびすべての要素がかかりますすべての可能な連結でリストのリストを構築することができる。

今、基本ケースが必要です。 のリストのリストが1つだけでなく、6つではないとします。 cart機能をどのように適用しますか?まあ、それは第二引数内のすべての要素に最初の引数から各要素を追加しているので、我々は2番目の引数として、単一の空のリストのリストを渡すことができ、そして最初の引数として[0..20]

cart [0..20] [[]] 

我々は

を取得します
[[0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20]] 

素晴らしい。今、私たちはただ[[]]で始まる、独自の結果を6回にそれを適用します。

foldr ($) [[]] $ replicate 6 (cart [0..20]) 

($)は関数適用です。 Control.Monadから

replicateMnモナドアクションのsequence次のように定義される。replicateM n x = sequence (replicate n x)):

replicateM 6 [0..20] 
(正確には、ある理由のために例えば Why does application of `sequence` on List of Lists lead to computation of its Cartesian Product?を参照)のリストに適用された場合、基本的には同じだから短い答えは、このようになるん

これ以降にマップすることができます。

map (\x -> (x, magicFunction x)) $ replicateM 6 [0..20] 
1

foo f xs = map (\ys -> (ys,f ys)) (replicateM (length xs) xs)

replicateM (length xs) xsxs内のすべての要素の組み合わせを生成します。次に、それをマップするだけです。 GHCiの中

結果:

>import Control.Monad 
>let foo f xs = map (\ys -> (ys,f ys)) (replicateM (length xs) xs) 
>foo sum [1,2] 
[([1,1],2),([1,2],3),([2,1],3),([2,2],4)] 
関連する問題