大家好日子。
我想要完成的是转换列表
[ [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);
但当然它只是将内容更深入地包含在括号中。我是函数式编程的新手,所以任何帮助或提示都会非常感激。提前谢谢!
答案 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
获取列表并将其展平。
我的解决方案实际上是做同样的事情,只是用更多的速记。具体来说,(:[])
仅适用于列表return
,concat $ map f xs
与列表xs >>= f
相同。然后我也删除了显式的xs
参数,因为你所做的只是将它传递给你真正定义的部分应用的函数。
答案 4 :(得分:0)
一个递归版本,不是最短的,但它说明了每个嵌套列表中每个项目的包装,并且连接了包装的嵌套列表,
reWrap :: [[a]] -> [[a]]
reWrap [] = [[]]
reWrap (xs:xss) = (map (:[]) xs) ++ reWrap xss