如何在嵌套列表的元素上映射函数

时间:2014-05-14 16:31:09

标签: haskell

这是一个棘手的问题。

但是在嵌套列表中映射函数(本例中为+1)的标准方法是什么?

map (\x -> map (+1) x) [[1,2,3],[4,5,6]]

我在我的代码中使用了上述方法,但有什么好办法呢?是否有像mapNested (+1) [[1,2,3],[4,5,6]]或类似的东西?我使用谷歌和谷歌,但得到了太多的通用结果。

3 个答案:

答案 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]]