2011-06-19 12 views
2

通報可能性の重複:
Cartesian productハスケル:リスト

私はHaskellの初心者だと私は問題があります。私は、リストの最初の要素をとり、2番目のリストのすべての要素に接続し、その後に2番目の要素を最初のリストから取り出して同じようにするいくつかの関数を実行したい。 例えば、私が利用したい: [1]、[2]、[3])と[4]、[5]、[6] 出力に

[([1],[4]),([1],[5]),([1],[6]), 
([2],[4]),([2],[5]),([2],[6]), 
([3],[4]),([3],[5]),([3],[6])] 

を取得閉じ私が見つけたのは転位です

transpose [[1,2,3],[4,5,6]] 
[[1,4],[2,5],[3,6]] 

私は助けていただきたいと思います。

編集: 私には恥があります。私は結果があるソリューション

[[x,y] | x <- [[1],[2],[3]], y <- [[4],[5],[6]]] 

が見つかりました:

[[[1],[4]],[[1],[5]],[[1],[6]],[[2],[4]],[[2],[5]],[[2],[6]],[[3],[4]],[[3],[5]],[[3],[6]]] 
+2

のように思える:それは私が探していたまさにですhttp://stackoverflow.com/questions/4119730/cartesian-product – Kru

+0

感謝を:) – ahaw

答えて

1

は、私はまたのhaskellする新たなんだが、ここにあなたの質問に対する私の解決策があり、それが参考に願っています:

f [] _ = [] 
f (x:xs) ys = zip (take (length ys) (repeat x)) ys ++ f xs ys 

私は思いますコードは非常にまっすぐ前方説明しています:)

4
import Control.Applicative 

(,) <$> [[1],[2],[3]] <*> [[4],[5],[6]] 

--[([1],[4]),([1],[5]),([1],[6]),([2],[4]),([2],[5]),([2],[6]),([3],[4]),([3],[5]),([3],[6])] 

説明はhttp://learnyouahaskell.com/functors-applicative-functors-and-monoids#applicative-functorsを参照してください。

リストは、あまりにも、ではないだけですApplicativeが、Monadsのようにしても、do記法を使用することができます。

do x<-[[1],[2],[3]]; y<-[[4],[5],[6]]; return (x,y) 

--[([1],[4]),([1],[5]),([1],[6]),([2],[4]),([2],[5]),([2],[6]),([3],[4]),([3],[5]),([3],[6])] 
1

これは面白いです。

sequence [[[1],[2],[3]] , [[4],[5],[6]]]