[英]Isomorphic `fmap` in Haskell
Haskell的Prelude中是否存在这样的事情?
wfmap :: Functor f
=> a
-> (a -> b)
-> (b -> a)
-> (b -> f b)
-> f a
wfmap x u w g = fmap (w) (g (u x))
在我正在进行的一个项目中,我经常发现自己“转换”了一种类型,处理它并“转换”它。
正如左下图所示,重新排序参数允许更整洁的定义:
wfmap :: Functor f => (a -> b) -> (b -> a) -> (b -> f b) -> a -> f a
wfmap u w g = fmap w . g . u
至于图书馆支持, 镜头 为同构提供了极好的支持 。 更广泛地说,正如Gurkenglas所说的......
Functor f => (b -> fb) -> a -> fa
也称为Lens' ab
,是镜头库的核心。
如果不深入了解其工作方式和原因的细节,一个结果就是您的功能可能被定义为:
wfmap :: Functor f => (a -> b) -> (b -> a) -> (b -> f b) -> a -> f a
wfmap u w g = (iso u w) g
甚至:
wfmap :: Functor f => (a -> b) -> (b -> a) -> (b -> f b) -> a -> f a
wfmap = iso
wfmap
只是( iso
一个特殊版本),它提供了一个函数,可以用来将同构“destination”上的b -> fb
函数转换为同构“source”上的a -> fa
。
值得一提的是mapping
,它可以用于在同构的另一侧应用fmap
不同目的:
GHCi> :t \u w g -> over (mapping (iso u w)) (fmap g)
\u w g -> over (mapping (iso u w)) (fmap g)
:: Functor f => (s -> a) -> (b -> t) -> (a -> b) -> f s -> f t
GHCi> :t \u w g -> under (mapping (iso u w)) (fmap g)
\u w g -> under (mapping (iso u w)) (fmap g)
:: Functor f => (s -> a) -> (b -> a1) -> (a1 -> s) -> f b -> f a
最后,请注意, iso uw
可以替换为您在库中找到的任何Iso
,或者已在其他地方预定义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.