今天是个好日子。
我想要完成的是将列表转换为
将[ [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 (:[]))