Haskell中的同构`fmap`

时间:2016-12-03 12:27:39

标签: haskell functor

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))

在我正在进行的项目中,我经常发现自己“转换”了一种类型,处理它并“转换”它。

1 个答案:

答案 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