所以我有
pair:: [a] -> [b] -> [(a,b)]
pair[] _ = []
pair(x:xs) (y:ys) = (x, y) : prod xs ys
但结果如下:
>> pair [1,2] [3,4]
>> [(1,3),(2,4)]
我怎样才能这样做,所以它就像:
[(1,3),(1,4),(2,3),(2,4)]
答案 0 :(得分:9)
您可以使用list applicative(或monad)实例:
λ> liftA2 (,) [1,2] [3,4]
[(1,3),(1,4),(2,3),(2,4)]
或者,相当于
f = do
x <- [1,2]
y <- [3,4]
return (x,y)
您还可以使用列表理解:
[ (x,y) | x <- [1,3], y <- [2,4] ]
答案 1 :(得分:1)
虽然已经有了更优雅的答案,但我认为值得展示如何以简单明了的方式实现这一目标。如果你想获得所有对,你显然需要访问另一个元素的一个列表的每个元素。
pair :: [a] -> [b] -> [(a, b)]
pair [] _ = []
pair (x:xs) ys = pair' x ys ++ pair xs ys where
pair' :: a -> [b] -> [(a, b)]
pair' _ [] = []
pair' x (y:ys) = (x,y) : pair' x ys
但是当然在其pair = liftA2 (,)
符号或列表理解符号中使用[1,3] >>= \x -> [2,4] >>= \y -> (x,y)
或do
要好得多。 ++
也不是您通常想做的事情。所以也许你可以像pair'
那样建立列表,将它们保存在一个列表中然后concat
。
concat $ map (\x -> map (\y -> (x,y)) ys) xs