Haskell-新手报告。问题如下:在Haskell中,我们有返回2元组的第一个和第二个元素的fst和snd。为什么我们没有一种简单的方法来访问任何元组中的第i个元素?现在我有一个三元组,我想读取第一个元素,完成这个任务的唯一方法是做模式匹配技巧。为什么不能更容易地做到这一点?或者,也许有一些简单的方法?
发布于 2011-05-01 04:50:41
查看hackage上的tuple library。它具有重载函数,用于对元组进行各种操作(直到预定义的大小)。
发布于 2011-05-01 04:42:34
N元组不是用于通过Int键进行索引的数据结构,相反,您应该查看偏向于索引的数据结构,如arrays或finger-trees.
现在,人们可以想象编写a typeclass for a family of tuple types providing an index operation,然而,我们已经有了数组,并且有许多必要的样板来使任何类型的元组无缝地提供这种操作。所获得的力量不值得你付出这些努力。
发布于 2014-05-26 06:59:41
为什么不能简单一点呢?或者,也许有一些简单的方法?
使用最新的替代方案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,因此树、映射、向量等。例如,如果我有一个元组列表,我可以通过组合element 1来访问第一个索引元素来访问第一个索引元素,并使用_3来访问第三个元组元素。
[(1,2,3),(4,5,6),(7,8,9)] ^? element 1 . _3
Just 6https://stackoverflow.com/questions/5844347
复制相似问题