Haskell:将列表列表中的所有内容包装为一个元素列表的列表

时间:2015-05-21 20:47:48

标签: list haskell sublist

大家好日子。

我想要完成的是转换列表 [ [1, 2, 3], [25, 24, 23, 22], [13] ] [ [1], [2], [3], [25], [24], [23], [22], [13] ]reWrap :: [[a]] -> [[a]] reWrap data = map (map (:[])) data

我试过像

这样的东西
final List<Integer> list = ImmutableList.of(1, 5, 10, 27, 57, 193);

但当然它只是将内容更深入地包含在括号中。我是函数式编程的新手,所以任何帮助或提示都会非常感激。提前谢谢!

5 个答案:

答案 0 :(得分:6)

这显然是一个良好的旧列表理解的案例:

 rewrap xss = [ [x] | xs <- xss, x <- xs ]

答案 1 :(得分:5)

如果你使用concatMap前奏函数,这很容易:

λ> :t concatMap
concatMap :: (a -> [b]) -> [a] -> [b]

concatMap做的是map一个函数,然后是concat生成的列表。

如果我们使用此定义,我们可以获得所需的效果:

solution :: [[a]] -> [[a]]
solution = concatMap (map (:[]))

这是在行动:

λ> solution [[1,2,3],[4,5,6]]
[[1],[2],[3],[4],[5],[6]]
λ> solution [[1,2,3],[],[12,19]]
[[1],[2],[3],[12],[19]]

正如@amalloy所说,列表中的>>=函数等同于flip concatMap,所以你可以这样说:

solution = (=<<) (map (:[]))

答案 2 :(得分:4)

首先你需要连接列表

[ [1, 2, 3], [25, 24, 23, 22], [13] ] 变为[1,2,3,25,24,23,22,13]

然后你需要将每个元素包装在一个列表中

reWrap = map (:[]) . concat

答案 3 :(得分:2)

也许reWrap = (>>= map return)?但这对初学者来说可能太过深奥了。有一个解决方案非常接近您正在尝试的解决方案:rewrap xs = concat $ map (map (:[])) xs。请注意,您的输出非常接近您想要的输出,除了列表中的所有内容都只是一个级别太深; concat获取列表并将其展平。

我的解决方案实际上是做同样的事情,只是用更多的速记。具体来说,(:[])仅适用于列表returnconcat $ map f xs与列表xs >>= f相同。然后我也删除了显式的xs参数,因为你所做的只是将它传递给你真正定义的部分应用的函数。

答案 4 :(得分:0)

一个递归版本,不是最短的,但它说明了每个嵌套列表中每个项目的包装,并且连接了包装的嵌套列表,

reWrap :: [[a]] -> [[a]]
reWrap [] = [[]]
reWrap (xs:xss) = (map (:[]) xs) ++ reWrap xss