gpt4 book ai didi

haskell - 对元组的所有值有任何内置的 fmap-of-sorts 吗?

转载 作者:行者123 更新时间:2023-12-02 13:07:07 26 4
gpt4 key购买 nike

现在我有这个小 helper 了:

both f (one,two) = (f one , f two)

然后我闲着想知道 fmap 是否“迭代”一个元组,所以我问 GHCi:

fmap reverse ("aA","bB")

结果是:

("aA","Bb")

奇怪!因此,如果您愿意的话,fmap 在元组上的语义似乎是“将 func 应用于 snd”。

我应该使用basePrelude中的任何内容来代替我自己的两者?胡格尔给出了no promising results或者我错误地解析了它们。

最佳答案

就元组的两个元素的“映射”而言,最好的是 bimap :: Bifunctor p => (a -> b) -> (c -> d) -> p a c -> p b d定义于 Data.Bifunctor (现在在base!)。这样,你就可以写

ghci> bimap reverse reverse ("aA","bB")
("Aa","Bb")

或者,您可以使用(***) :: Arrow a => a b c -> a b' c' -> a (b, b') (c, c')定义于 Control.Arrow (特别是使用 Arrow (->) 实例)。这样,你就可以写

ghci> (reverse *** reverse) ("aA","bB")
("Aa","Bb")

但是,如果您尝试同时映射元组的两个元素,也许您正在寻找将 a 类型的两个值组合在一起的抽象。 。如果是这种情况,我建议您使用 newtype左右(a,a) 。然后,您可以打开-XDeriveFunctor扩展名如下

ghci> :set -XDeriveFunctor
ghci> newtype Pair a = Pair (a,a) deriving (Show,Functor)
ghci> fmap reverse (Pair ("aA","bB"))
Pair ("Aa","Bb")

关于haskell - 对元组的所有值有任何内置的 fmap-of-sorts 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41430428/

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