2011-06-19 117 views
2

可能重複:
Cartesian product哈斯克爾:問題列表

我的Haskell新手,我有一個問題。我想做一些函數,將列表的第一個元素並連接到第二個列表的所有元素,然後從第一個列表中獲取第二個元素並執行相同的操作。 例如,我想利用: [[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

我也新哈斯克爾,這裏是我的解決你的問題,希望這是有幫助的:

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

您還可以使用DO-符號,如列表不僅Applicative,但Monads,太:

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]]]