Haskell中两个列表的所有配对,没有列表理解

时间:2016-04-25 19:40:52

标签: list haskell functional-programming

我正在阅读Bird和Wadler在函数式编程中的好书 并试图解决Haskell中的练习。

关于列表的章节有一节说明任何列表理解 可以使用mapfilterconcat以及map可能需要的附属函数来实施

我无法根据这些构建块实现以下表达式。

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

如何使用地图和过滤器?

我做到了

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

我怀疑我们必须在这里巧妙地使用currying,但我似乎无法弄明白。

2 个答案:

答案 0 :(得分:6)

对于每个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')]]

答案 1 :(得分:1)

虽然我不确定ApplicativeDo是否允许作为构建块&#34;的一部分,但如果是,则可以通过将元组函数映射到第一个列表来轻松实现,将该清单应用于第二个。

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