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))
在我正在进行的项目中,我经常发现自己“转换”了一种类型,处理它并“转换”它。
答案 0 :(得分:7)
如左下所示,重新排序参数允许更整洁的定义:
wfmap :: Functor f => (a -> b) -> (b -> a) -> (b -> f b) -> a -> f a
wfmap u w g = fmap w . g . u
至于图书馆支持,镜头提供nifty support for isomorphisms。更广泛地说,正如Gurkenglas所指出的那样......
Functor f => (b -> f b) -> a -> f a
也称为Lens' a b
,是镜头库的核心。
如果不深入了解其工作方式和原因的详细信息,可能会导致您的功能被定义为:
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
的一个特殊版本,它提供了一个函数,可用于在同构"目的地&#34上转换b -> f b
函数;在isomorphism" source"上的a -> f a
一个。
值得一提的是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 u w
可以替换为您在库中找到的或在其他位置预定义的任何Iso
。