我正在阅读Bird和Wadler在函数式编程中的好书 并试图解决Haskell中的练习。
关于列表的章节有一节说明任何列表理解
可以使用map
,filter
和concat
以及map
可能需要的附属函数来实施
我无法根据这些构建块实现以下表达式。
[(x,y) | x<- xs, y<- ys]
如何使用地图和过滤器?
我做到了
concat [ map (\ a -> (a,x)) ys | x<-xs ]
我怀疑我们必须在这里巧妙地使用currying,但我似乎无法弄明白。
答案 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)]