5

任意のタイプの 2 つのリストを取り、1 つを返す関数 (つまりf:: [[a]] -> [[a]] -> [[a]]) が必要です。基本的に、2 つの入力リストの「連結」も生成します。

例えば

> 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

これはデカルト積であるため、1 つのリスト内包表記を使用してすべてを行うことができます。

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 に答える