访问元组中的特定元素

34 haskell functional-programming tuples

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

Fre*_*Foo 29

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

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

  • ghc没有这方面的扩展,但是有提供它的库(参见augustss的回答). (2认同)

aug*_*tss 21

查看hackage上的元组库.它为元组上的各种操作(最多预定义的大小)重载了函数.


Don*_*art 13

N元组不是通过Int键索引的数据结构,相反,您应该查看一个索引偏向的数据结构,例如数组指树.

现在,可以想象为一个提供index操作的元组类型系列编写一个类型类,但是,我们已经有了数组,并且需要很多样板来使任何类型的元组无缝地提供此操作.获得的力量不值得努力.


Dav*_*rak 8

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

使用镜头包装的最新替代品可能更容易 .该元组模块具有选择多达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
Run Code Online (Sandbox Code Playgroud)

您还可以使用 镜头包以多态方式更新元素,在更新时更改类型.

有和没有中缀运营商:

> (1, '2', "3", A) & _1 .~ "wow"
("wow",'2',"3",A)
 > set _1 "wow" (1, '2', "3", A)
("wow",'2',"3",A)
Run Code Online (Sandbox Code Playgroud)

GitHub的自述是开始了解更多有关基本理论,以及无数的例子的好地方.


不只是元组

类似的语法适用于TraverablesFoldables,所以树,地图,矢量等.例如,如果我有一个元组列表,我可以通过组合element 1访问第一个索引元素_3来访问第三个元组,在1索引处访问第三个元组元素元件.

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


mon*_*onk 5

使用模板haskell进行此操作的方法问题先前已在此处解决

其用法示例:

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

从这里

  • 我的冲动是说“ -1迫使用户将元组的大小包含在'sel'中,特别是因为它总是紧随其所选择的元组之前”,但是-1当然在TH编写器上,而不是用户。 (2认同)