gpt4 book ai didi

haskell - Haskell中的同构 `fmap`

转载 作者:行者123 更新时间:2023-12-03 14:49:08 26 4
gpt4 key购买 nike

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

在我正在进行的一个项目中,我经常发现自己将一种类型“转换”为另一种类型,对其进行处理并“转换”回来。

最佳答案

正如 leftaroundabout 所建议的那样,重新排序参数允许更整洁的定义:

wfmap :: Functor f => (a -> b) -> (b -> a) -> (b -> f b) -> a -> f a
wfmap u w g = fmap w . g . u

至于库支持,lens提供 nifty support for isomorphisms .正如古尔肯格拉斯所说,更广泛地说……

Functor f => (b -> f b) -> a -> f a is also called Lens' a b and is the centerpiece of the lens library.



如果不深入了解其工作原理和原因的细节,一个后果是您的函数可能被定义为:
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 ,它给出了一个函数,可以用来转换 b -> f b 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您可能会在库中找到或在其他地方预定义。

关于haskell - Haskell中的同构 `fmap`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40947741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com