2016-04-25 59 views
0

我正在閱讀Bird和Wadler在函數式編程 中的好書,並試圖解決Haskell中的練習。Haskell中的兩個列表的全部配對沒有列表理解

上列出了一章有一節它說,任何列表理解 可以在其中一個可能需要爲map

我有實施以下表達式麻煩mapfilterconcat和附屬功能方面實現就這些構建塊而言。

[(x,y) | x<- xs, y<- ys] 

如何使用地圖和過濾器呢?

我得到儘可能做

concat [ map (\ a -> (a,x)) ys | x<-xs ]

我懷疑,我們必須使用巧妙這裏討好,但我似乎無法推測出來。

+1

的可能的複製[刪除語法糖:在Haskell列表理解(http://stackoverflow.com/questions/8029046/removing-syntactic-sugar-list-comprehension -in-haskell) – Mephy

+0

相關:http://stackoverflow.com/questions/32093912/all-combinations-of-elements-of-two-lists-in-haskell – Jubobs

回答

5

以及每個x你需要的所有y這麼:

\x -> map (\y -> (x,y)) ys 

現在你只需要在所有xs

cross xs ys = map (\x -> map (\y -> (x,y)) ys) xs 

例如映射這樣的:

> cross [1..3] "AB" 
[[(1,'A'),(1,'B')],[(2,'A'),(2,'B')],[(3,'A'),(3,'B')]] 
+0

非常好!非常感謝! – smilingbuddha

1

雖然我我不確定ApplicativeDo是否被允許作爲你的「建築物」的一部分ocks「,但如果是這樣,可以通過將元組函數映射到第一個列表並將該列表應用於第二個列表來輕鬆實現。

import Control.Applicative 

let xs = [1,2,3] 
    ys = [4,5,6] 

(,) <$> xs <*> ys 

結果:

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