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

mrs*_*eve 10 haskell

这是一个棘手的问题.

但是+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)

  • 虽然它相当于`fmap.fmap`,您可以为此操作编写`fmap fmap fmap`.它是等价的,因为第一个`fmap`被应用于`( - >)r`仿函数,它只是变成了组合.不过,它是一个相当有趣的抽象,它允许您将这个嵌套计算2层深度映射到任意两个仿函数中.它也等同于`(.:) =(.).(.)`运算符但更通用. (3认同)
  • 我看到了`地图.map`这对我来说有点违反直觉,所以这里是......衍生出来https://gist.github.com/skatenerd/767e2042f388bde63779 (2认同)

arr*_*owd 5

您需要组成地图: (map . map) (+1) [[1,2,3],[4,5,6]]