List Haskell中无列表理解的两个列表的All-to-All对

List Haskell中无列表理解的两个列表的All-to-All对,list,haskell,functional-programming,List,Haskell,Functional Programming,我正在阅读Bird和Wadler关于函数式编程的好书 并试图解决哈斯克尔的练习 关于列表的一章有一节说任何列表理解 可以按照map、filter和concat以及map 对于这些构建块,我很难实现以下表达式 [(x,y) | x<- xs, y<- ys] [(x,y)|x对于每个x您都需要所有ys,因此: \x -> map (\y -> (x,y)) ys 现在,您只需将此映射到所有xs cross xs ys = map (\x -> map (\y -&

我正在阅读Bird和Wadler关于函数式编程的好书 并试图解决哈斯克尔的练习

关于列表的一章有一节说任何列表理解 可以按照
map
filter
concat
以及
map

对于这些构建块,我很难实现以下表达式

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

[(x,y)|x对于每个
x
您都需要所有
y
s,因此:

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

对于每个
x
您都需要所有
y
s,因此:

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

虽然我不确定ApplicationVedo是否允许作为“构建块”的一部分,但如果允许,可以通过将元组函数映射到第一个列表并将该列表应用到第二个列表来轻松实现

import Control.Applicative

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

(,) <$> xs <*> ys

虽然我不确定ApplicationVedo是否允许作为“构建块”的一部分,但如果允许,可以通过将元组函数映射到第一个列表并将该列表应用到第二个列表来轻松实现

import Control.Applicative

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

(,) <$> xs <*> ys

相关的可能重复:相关的可能重复:非常好!非常感谢!非常好!非常感谢!