5

我想要一个函数,它接受两个任意类型的列表并返回一个(即f:: [[a]] -> [[a]] -> [[a]])。基本上,也产生两个输入列表的“连接”。

例如

> f [[1,2,3], [123]] [[4,5,6], [3,7]]
[[1,2,3,4,5,6], [1,2,3,3,7], [123,4,5,6], [123,3,7]]

我目前已经做到了这一点:

f _ [] = []
f [] _ = []
f (xs:xss) (ys:yss) = ((xs ++ ys) : [m | m <- f [xs] yss])

但这没有考虑到xss,而且是错误的。有什么建议么?

4

5 回答 5

9

它是笛卡尔积,因此您只需使用一个列表推导即可完成所有操作。

Prelude> let xs = [[1,2,3], [123]]
Prelude> let ys = [[4,5,6], [3,7]]
Prelude> [x ++ y | x <- xs, y <- ys]
[[1,2,3,4,5,6],[1,2,3,3,7],[123,4,5,6],[123,3,7]]
于 2012-03-13T21:51:52.147 回答
3
import Control.Applicative

(++) <$> [[1,2,3], [123]] <*> [[4,5,6], [3,7]]
[[1,2,3,4,5,6],[1,2,3,3,7],[123,4,5,6],[123,3,7]]
于 2012-03-13T21:52:21.720 回答
3
f l1 l2 = [x ++ y | x <- l1, y <- l2]
于 2012-03-13T21:52:29.840 回答
2

Alternative

import Control.Applicative

f :: (Applicative f, Alternative g) => f (g a) -> f (g a) -> f (g a)
f = liftA2 (<|>)
于 2012-03-14T07:58:49.057 回答
1
f a b = map concat . sequence $ [a,b]

放大以组合任意数量的列表。

于 2012-03-14T15:00:05.293 回答