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根据输入与自己组合多少次的东西。
您可以使用一种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