从一个列表追加到第二个列表 - haskell

时间:2017-08-31 02:51:49

标签: haskell

我想要一个函数,我在其中传递一个列表列表和一个列表,例如[[1,2,3],[5,6,3],[9,12,7]][4,5,6]

并且该函数应返回列表列表,其中第二个列表中的每个项目都附加到第一个列表的末尾

例如,输出将为[[1,2,3,4],[1,2,3,5],[1,2,3,6],[9,12,7,5],[9,12,7,6],[9,12,7,4],[5,6,3,4],[5,6,3,5],[5,6,3,6]]

感谢

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点,比如

Prelude> x = [[1,2,3],[5,6,3],[9,12,7]]
Prelude> y = [4,5,6]
Prelude> (flip (++) . return) <$> y <*> x
[[1,2,3,4],[5,6,3,4],[9,12,7,4],[1,2,3,5],[5,6,3,5],[9,12,7,5],[1,2,3,6],[5,6,3,6],[9,12,7,6]]

您可以将<$>视为中缀fmap<*>作为笛卡尔积。

或列表理解

Prelude> [ a ++ [b] | a <- x, b <- y ]
[[1,2,3,4],[1,2,3,5],[1,2,3,6],[5,6,3,4],[5,6,3,5],[5,6,3,6],[9,12,7,4],[9,12,7,5],[9,12,7,6]]

do语法

f :: [a] -> [[a]] -> [[a]]
f ys xs = do
    y <- ys
    x <- xs
    return $ x ++ return y

main :: IO ()
main = do
    let x = [[1,2,3],[5,6,3],[9,12,7]]
    let y = [4,5,6]
    print $ f y x

有关详细信息,请参阅

  1. http://learnyouahaskell.com/functors-applicative-functors-and-monoids
  2. http://learnyouahaskell.com/a-fistful-of-monads