关于通过几个嵌套函数级别的映射

Enr*_*lis 6 haskell functional-programming idioms nested functor

一个随机的例子:给定以下[Maybe [a]]

x = [Just [1..3], Nothing, Just [9]]
Run Code Online (Sandbox Code Playgroud)

我想f = (^2)通过3层映射,从而获得

[Just [1,4,9],Nothing,Just [81]]
Run Code Online (Sandbox Code Playgroud)

最简单的方法似乎是

(fmap . fmap . fmap) (^2) x
Run Code Online (Sandbox Code Playgroud)

哪里fmap . fmap . fmap就像fmap,但它深入 3 个级别。

我怀疑需要这样的东西,在一般情况下fmap与自己组合给定的次数,并不少见,所以我想知道标准中是否已经有一些东西可以fmap与自己组合一定次数。或者也许是“知道”它应该fmap根据输入与自己组合多少次的东西。

Wil*_*sem 3

您可以使用一种Compose类型来深入两层(如果级联则更多)函子深度。

所以我们可以将其实现为:

import Data.Functor.Compose(Compose(Compose, getCompose))

fmap (^2) (Compose (Compose [Just [1,4,9],Nothing,Just [81]]))
Run Code Online (Sandbox Code Playgroud)

然后得出:

Prelude Data.Functor.Compose> fmap (^2) (Compose (Compose [Just [1,4,9],Nothing,Just [81]]))
Compose (Compose [Just [1,16,81],Nothing,Just [6561]])
Run Code Online (Sandbox Code Playgroud)

因此我们可以用以下方法打开它:

Prelude Data.Functor.Compose> (getCompose . getCompose . fmap (^2)) (Compose (Compose [Just [1,4,9],Nothing,Just [81]]))
[Just [1,16,81],Nothing,Just [6561]]
Run Code Online (Sandbox Code Playgroud)

通过构造一个深度Compose为 2 的结构,我们将其作为结合两者Functor的实例。Functor

  • 所以,“getCompose”。获取撰写。fmap (^2) 。撰写。撰写`,甚至`强制。fmap (^2) 。撰写。Compose`,但这可能比原来的 `fmap 没有多大改进。地图。fmap`。 (2认同)