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