Haskell - 如何将此列表与所有元素组成元组函数?

时间:2015-09-12 19:12:30

标签: haskell

所以我有

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

2 个答案:

答案 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