Haskell-newbie报道。
问题如下:
在Haskell中,我们有fst
和snd
返回2元组的第一个和第二个元素。为什么我们没有一个简单的方法从任何元组访问第i个元素?现在我有一个3元组,我想读第一个元素,完成这个任务的唯一方法是进行模式匹配技巧。为什么不能这样做更容易?或者也许有一些简单的方法?
答案 0 :(得分:28)
什么阻止语言拥有你想要的特殊结构是它的设计。设计师并没有把它放进去,因为它会使语言定义变得复杂,这很简单。 fst
和snd
是对象的常见情况的库函数;您可以自己定义所有其他人,或者更好地定义数据的记录类型,以便您的数据成员具有适当的名称。
(可能是GHC有一个扩展来执行此操作,但我没有遇到过;检查文档或在邮件列表上询问是否确定。)
答案 1 :(得分:21)
查看关于hackage的tuple library。它为元组上的各种操作重叠了函数(最大为预定义的大小)。
答案 2 :(得分:13)
N -tuples不是通过Int
键进行索引的数据结构,相反,您应该查看一个索引偏向的数据结构,例如arrays或finger-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是一个开始了解更多有关基础理论以及众多例子的好地方。
类似的语法适用于Traverables
和Foldables
,因此树,地图,矢量等等。例如,如果我有一个元组列表,我可以通过编写访问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'
答案 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功能似乎可以满足您的需求。搜索标题"元组也是记录!"在链接页面上。
看起来图书馆仍处于开发阶段,因此现在安装和使用可能不会像将来那样容易。