访问元组中的特定元素

时间:2011-04-30 20:12:58

标签: haskell functional-programming tuples

Haskell-newbie报道。 问题如下: 在Haskell中,我们有fstsnd返回2元组的第一个和第二个元素。为什么我们没有一个简单的方法从任何元组访问第i个元素?现在我有一个3元组,我想读第一个元素,完成这个任务的唯一方法是进行模式匹配技巧。为什么不能这样做更容易?或者也许有一些简单的方法?

7 个答案:

答案 0 :(得分:28)

什么阻止语言拥有你想要的特殊结构是它的设计。设计师并没有把它放进去,因为它会使语言定义变得复杂,这很简单。 fstsnd是对象的常见情况的库函数;您可以自己定义所有其他人,或者更好地定义数据的记录类型,以便您的数据成员具有适当的名称。

(可能是GHC有一个扩展来执行此操作,但我没有遇到过;检查文档或在邮件列表上询问是否确定。)

答案 1 :(得分:21)

查看关于hackage的tuple library。它为元组上的各种操作重叠了函数(最大为预定义的大小)。

答案 2 :(得分:13)

N -tuples不是通过Int键进行索引的数据结构,相反,您应该查看一个索引偏向的数据结构,例如arraysfinger-trees.

现在,可以想象编写a typeclass for a family of tuple types providing an index operation,但是,我们已经有了数组,并且需要很多样板来使任何类型的元组无缝地提供此操作。获得的力量不值得努力。

答案 3 :(得分:8)

  

为什么这样做更容易?或者也许有一些简单的方法?

使用最近的替代方案可能更容易 lens包。 Tuple module具有最多9个元素元组的选择器,如果需要,可以直接定义更多元素。

> import Control.Lens
> data A = A deriving (Show)
> (1, '2', "3", A) ^. _1
1
> (1, '2', "3", A) ^. _2
'2'
> (1, '2', "3", A) ^. _3
"3"
> (1, '2', "3", A) ^. _4
A

你也可以使用 lens包以多态方式更新元素,在更新时更改类型。

有和没有中缀运营商:

> (1, '2', "3", A) & _1 .~ "wow"
("wow",'2',"3",A)
 > set _1 "wow" (1, '2', "3", A)
("wow",'2',"3",A)

github readme是一个开始了解更多有关基础理论以及众多例子的好地方。


不仅仅是元组

类似的语法适用于TraverablesFoldables,因此树,地图,矢量等等。例如,如果我有一个元组列表,我可以通过编写访问1索引处的第三个元组元素element 1访问带_3的第一个索引元素以访问第三个元组元素。

[(1,2,3),(4,5,6),(7,8,9)] ^? element 1 . _3
Just 6

答案 4 :(得分:4)

使用模板haskell执行此操作的方法的问题是previously addressed here

其用法示例:

> $(sel 2 3) ('a','b','c')
'b'
> $(sel 3 4) ('a','b','c','d')
'c'

From here

答案 5 :(得分:2)

cabal update
cabal install tuple
ghci

λ> import Data.Tuple.Select
λ> sel3 (0, "1", 2) --select the third element

答案 6 :(得分:1)

Nikita Volkov的新"record" library功能似乎可以满足您的需求。搜索标题"元组也是记录!"在链接页面上。

看起来图书馆仍处于开发阶段,因此现在安装和使用可能不会像将来那样容易。