这是一个棘手的问题。
但是在嵌套列表中映射函数(本例中为+1
)的标准方法是什么?
map (\x -> map (+1) x) [[1,2,3],[4,5,6]]
我在我的代码中使用了上述方法,但有什么好办法呢?是否有像mapNested (+1) [[1,2,3],[4,5,6]]
或类似的东西?我使用谷歌和谷歌,但得到了太多的通用结果。
答案 0 :(得分:17)
有几种方法,但最明显的是:
Prelude> map (map (+1)) [[1,2,3],[4,5,6]]
[[2,3,4],[5,6,7]]
这将是教科书的答案。
也许你喜欢用列表理解来做外部部分?
Prelude> [ map (+1) xs | xs <- [[1,2,3],[4,5,6]] ]
[[2,3,4],[5,6,7]]
甚至是整件事?
Prelude> [ [ x + 1 | x <- xs ] | xs <- [[1,2,3],[4,5,6]] ]
[[2,3,4],[5,6,7]]
答案 1 :(得分:14)
我不认为它在标准库中的任何地方定义,但您可以这样定义:
mapNested :: (a -> b) -> [[a]] -> [[b]]
mapNested = map . map
或者使它更通用(即,使用除列表之外的其他仿函数):
fmapNested :: (Functor f, Functor g) => (a -> b) -> f (g a) -> f (g b)
fmapNested = fmap . fmap
使用示例:
fmapNested (+1) [Some 1, None, Some 3] -- == [Some 2, None, Some 4]
答案 2 :(得分:5)
您需要合成地图:(map . map) (+1) [[1,2,3],[4,5,6]]