2012-03-13 77 views
5

我想要一個帶有兩個任意類型列表並返回一個(即f:: [[a]] -> [[a]] -> [[a]])的函數。基本上,也會產生兩個輸入列表的「連接」。Haskell中列表的連接

例如

> 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和是錯誤的。有什麼建議麼?

回答

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]] 
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]] 
+10

或只是'liftA2(++)' – luqui 2012-03-13 22:14:54

3
f l1 l2 = [x ++ y | x <- l1, y <- l2] 
+0

我怎麼錯過了這個!?!踢自己。基本的基本東西! – 2012-03-13 21:57:24

2

Alternative

import Control.Applicative 

f :: (Applicative f, Alternative g) => f (g a) -> f (g a) -> f (g a) 
f = liftA2 (<|>) 
1
f a b = map concat . sequence $ [a,b] 

秤彌補組合任意數量的列表。