今天是个好日子。

我想要完成的是将列表转换为
[ [1, 2, 3], [25, 24, 23, 22], [13] ]转换为[ [1], [2], [3], [25], [24], [23], [22], [13] ]

我尝试了类似的东西

reWrap :: [[a]] -> [[a]]
reWrap data = map (map (:[])) data

但当然它只是将内容更深地包裹在方括号中。我是函数式编程的新手,所以非常感谢您的帮助或技巧。先感谢您!

最佳答案

如果使用concatMap prelude函数,这很容易:

λ> :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 (:[]))

10-03 00:50