在Haskell中,我可以很容易地映射一个列表:
map (\x -> 2*x) [1,2]
给了我[2,4]
。有没有像这样工作的"mapTuple“函数?
mapTuple (\x -> 2*x) (1,2)
结果是(2,4)
。
发布于 2012-03-15 23:31:14
(a -> b) -> (a, a) -> (b, b)
是您所需要的类型,Searching at Hoogle没有给出精确的匹配,但是您可以很容易地自己完成:
mapTuple :: (a -> b) -> (a, a) -> (b, b)
mapTuple f (a1, a2) = (f a1, f a2)
请注意,您必须为3元组、4元组等定义一个新函数-尽管这样的需要可能是一个迹象,表明您没有像预期的那样使用元组:一般来说,元组包含不同类型的值,因此想要将一个函数应用于所有值并不是很常见。
发布于 2012-03-16 00:29:01
这里有一个相当简短的无点解决方案:
import Control.Monad (join)
import Control.Arrow ((***))
mapTuple = join (***)
发布于 2012-03-15 23:27:19
您可以使用Bifunctor
import Control.Monad (join)
import Data.Bifunctor (bimap)
join bimap (2*) (1,2)
这不仅适用于配对,还适用于许多其他类型,例如Either
。
从4.8版开始,base中就包含了Bifunctor
。以前它是由bifunctors包提供的。
https://stackoverflow.com/questions/9722689
复制相似问题