如何从Haskell中的10元组中获取第n个元素?

jas*_*son 25 haskell tuples

我必须在Haskell元组中获得第n个元素.元组是这样的:(3,5,"String1","String2","String3","String4","String5","String6","String7","String8","String9","String10 ").你能给我一个想法,以便我能解决这个问题吗?谢谢.

Tik*_*vis 43

你可以用模式匹配来做到这一点.就像你可以匹配两个或三个值的元组一样,你可以匹配一个十值元组.

let (_, _, _, _, _, _, _, _, _, x, _, _) = tuple in x
Run Code Online (Sandbox Code Playgroud)

但是,你可能不想这样做.如果你试图从元组中获取第n个值,那么你几乎肯定使用了错误的类型.在Haskell中,不同长度的元组是不同的类型 -它们从根本上是不兼容的.就像IntString是不同的,(Int, Int)而且(Int, Int, Int)也是完全不同的.

如果你想要一个可以获得第n个元素的数据类型,你需要一个列表:类似的东西[String].使用列表,您可以使用!!运算符进行索引(从0开始),因此您可以这样做:

myList !! 9
Run Code Online (Sandbox Code Playgroud)

获得第10个元素.

举个例子,我怀疑你想要的是类型(Int, Int, [String])而不是巨大的元组.这将让你有两个数字和任意数量的字符串; 您可以使用!!上面的运算符通过索引获取字符串.

  • 建议使用`!!`并不是一个好主意,因为它是部分的,建议使用列表按索引访问项目更糟糕.[Vector的`!?`](http://hackage.haskell.org/packages/archive/vector/0.10.0.1/doc/html/Data-Vector.html#v:-33--63-)另一方面手很好. (2认同)
  • 是,如果您需要用于存储索引数据的结构,则List不是正确的结构.它不适用于索引,更类似于控制流结构.矢量或数组就是为了这个 - 就像其他语言一样. (2认同)

Die*_*lan 33

因为你可能知道或者不知道fst和snd只适用于2元素元组,即

fst' (a,b) = a
Run Code Online (Sandbox Code Playgroud)

据我所知,你必须自己写

get5th (_,_,_,_,a,_,_,_,_,_) = a
Run Code Online (Sandbox Code Playgroud)

如您所见,您可能想要定义自己的类型.


Dan*_*ner 22

您可能希望使用元组包中的选择函数.


Zoe*_*wll 5

如果每个元组只需要执行一次,并且一次需要所有元素,则可以简单地使用

let (x, y, s1, s2, s3, s4, s5, s6, s7, s8) = someTuple
in ...
Run Code Online (Sandbox Code Playgroud)

并直接使用这些值。