首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Haskell:如何映射元组?

Haskell:如何映射元组?
EN

Stack Overflow用户
提问于 2012-03-15 23:16:00
回答 12查看 44.3K关注 0票数 68

在Haskell中,我可以很容易地映射一个列表:

map (\x -> 2*x) [1,2]

给了我[2,4]。有没有像这样工作的"mapTuple“函数?

mapTuple (\x -> 2*x) (1,2)

结果是(2,4)

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 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元组等定义一个新函数-尽管这样的需要可能是一个迹象,表明您没有像预期的那样使用元组:一般来说,元组包含不同类型的值,因此想要将一个函数应用于所有值并不是很常见。

票数 50
EN

Stack Overflow用户

发布于 2012-03-16 00:29:01

这里有一个相当简短的无点解决方案:

import Control.Monad (join)
import Control.Arrow ((***))

mapTuple = join (***)
票数 87
EN

Stack Overflow用户

发布于 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包提供的。

票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9722689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档