34 haskell functional-programming tuples
Haskell-newbie报告.问题如下:在Haskell中,我们有fst
并且snd
返回2元组的第一个和第二个元素.为什么我们没有一个简单的方法从任何元组访问第i个元素?现在我有一个3元组,我想读第一个元素,完成这个任务的唯一方法是进行模式匹配技巧.为什么不能这样做容易?或者也许有一些简单的方法?
Fre*_*Foo 29
什么阻止语言拥有你想要的特殊结构是它的设计.设计师并没有把它放进去,因为它会使语言定义复杂化,这很简单.fst
并且snd
是对的常见情况的库函数; 您可以自己定义所有其他人,或者更好地定义数据的记录类型,以便您的数据成员具有适当的名称.
(可能GHC有一个扩展来执行此操作,但我没有遇到过;检查文档或在邮件列表上询问是否确定.)
Don*_*art 13
N元组不是通过Int
键索引的数据结构,相反,您应该查看一个索引偏向的数据结构,例如数组或指树.
现在,可以想象为一个提供index
操作的元组类型系列编写一个类型类,但是,我们已经有了数组,并且需要很多样板来使任何类型的元组无缝地提供此操作.获得的力量不值得努力.
为什么不能这样做容易?或者也许有一些简单的方法?
使用镜头包装的最新替代品可能更容易 .该元组模块具有选择多达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的自述是开始了解更多有关基本理论,以及无数的例子的好地方.
类似的语法适用于Traverables
和Foldables
,所以树,地图,矢量等.例如,如果我有一个元组列表,我可以通过组合element 1
访问第一个索引元素_3
来访问第三个元组,在1索引处访问第三个元组元素元件.
[(1,2,3),(4,5,6),(7,8,9)] ^? element 1 . _3
Just 6
Run Code Online (Sandbox Code Playgroud)