我必须在Haskell元组中获得第n个元素。元组是这样的: (3,5,“String1”,“String2”,“String3”,“String4”,“String5”,“String6”,“String7”,“String8”,“String9”,“ String10" )。你能给我一个想法,以便我能解决这个问题吗? 谢谢。如何从Haskell的10元组中获得第n个元素?
15
A
回答
22
正如你可能会或可能不知道FST和snd仅2元元组工作即
fst' (a,b) = a
你必须写你自己的,据我所知
get5th (_,_,_,_,a,_,_,_,_,_) = a
,你可以看到你可能想要定义你自己的类型。
36
你可以用模式匹配来做到这一点。就像你可以匹配两个或三个值的元组一样,你可以匹配一个十值元组。
let (_, _, _, _, _, _, _, _, _, x, _, _) = tuple in x
但是,机会是你不希望向做到这一点。如果你试图从一个元组中获得第n个值,那么你几乎肯定会使用错误的类型。在Haskell中,不同长度的元组是不同的类型 - 它们从根本上不兼容。就像Int
和String
是不同的,(Int, Int)
和(Int, Int, Int)
也完全不同。
如果你想要一个数据类型,你可以得到第n个元素,你需要一个列表:像[String]
。随着名单,你可以使用!!
运营商索引(它从0开始),所以你可以只是做:
myList !! 9
拿到10元。
鉴于你的例子,我怀疑你想要的类型如(Int, Int, [String])
而不是一个巨大的元组。这将让你有两个数字和任意数量的字符串;您可以使用上述!!
运算符按索引获取字符串。
18
-2
我在查找相同问题的解决方案时看到了您的问题。我已阅读“!!”运营商是一个不好的解决方我已经想到了一个解决方案:
例如,如果你在你的列表中的每个元组三个要素,你可以这样做:
nTuple :: [(a, a, a)] -> Integer -> Integer -> [a]
nTuple list group position = [ fst x | x <- (concat [ fst x | x <- (zip [(zip[t1, t2, t3][0..]) | (t1, t2, t3) <- list ] [0..]) , snd(x) == group ]) , snd(x) == position]
现在,一些测试用例:
*Main> nTuple [("l","m","n"),("o","p","q"),("r","s","t")] 2 1
["s"]
*Main> nTuple [("l","m","n"),("o","p","q"),("r","s","t")] 0 2
["n"]
*Main> nTuple [("l","m","n"),("o","p","q"),("r","s","t")] 100 2
[]
*Main> nTuple [("l","m","n"),("o","p","q"),("r","s","t")] 2 100
[]
解说步骤通过上述函数的步骤:
1.Split元件,并把一个指数:
[ zip[t1,t2,t3][0..] | (t1,t2,t3) <- [("l","m","n"),("o","p","q"),("r","s","t")]]
result: [[("l",0),("m",1),("n",2)],[("o",0),("p",1),("q",2)],[("r",0),("s",1),("t",2)]]
2.对每个列表放一个索引。现在我们在每个组中都有组和职位。我们可以选择一组。例如“snd(x)== 1”的组编号为1(第一组为0)
[ fst x | x <- [([("l",0),("m",1),("n",2)],0),([("o",0),("p",1),("q",2)],1),([("r",0),("s",1),("t",2)],2)] , snd(x) == 1 ]
result: [[("o",0),("p",1),("q",2)]]
4.我们列出了一个列表。 Whe在单元列表中连接元组
concat [[("o",0),("p",1),("q",2)]]
result: [("o",0),("p",1),("q",2)]
5.最后,我们通过索引得到一个元素。在这个例子中,我们得到了第二个元素(第一个元素是“0”位置)
[ fst x | x <- [("o",0),("p",1),("q",2)] , snd(x) == 2]
result ["q"]
2
如果您只需要为每个元组这样做一次,你需要在一次所有的元素,你可以简单地使用
let (x, y, s1, s2, s3, s4, s5, s6, s7, s8) = someTuple
in ...
并直接使用这些值。
相关问题
- 1. 从Haskell中的二叉树中获取第N个元素
- 2. 获得集合的第n个元素
- 3. 如何获得配对元组列表中的第n个元素?
- 4. 如何获得LinkedList中的第n个元素<T>?
- 5. 从列表中获取第3个元素的第一个元素和第二个元素 - Haskell
- 6. 如何从Python中的元组获取第二个元素?
- 7. 如何从Haskell中的元组中获得一个Int
- 8. 如何获得一个元组元素
- 9. 如何获得独立序列的第n个元素?
- 10. 如何FMAP元组的第一个元素在Haskell
- 11. 如何从python中的元组列表中提取第n个元素?
- 12. jsoup:如何获得第一个元素?
- 13. 如何获得每个元素的第二元素列表
- 14. 在Haskell列表中访问列表中的第n个元素
- 15. 通过base px * n第n个元素缩进每个第n个元素
- 16. 从N元素的元组到N/2对的元组
- 17. Haskell:在元组列表中找到第一个元素x的元组
- 18. 如何过滤元组元组中的第二个元素?
- 19. 获取元素相对于第n个父元素的位置
- 20. 如何选择元素的第n个子元素?
- 21. 使用BeautifulSoup获取第n个元素
- 22. 列表:用于元组中第n个元素的使用
- 23. Powershell:如何引用第n个元素
- 24. 如何获得一个数组元素
- 25. 如何获得列表中每个元素的第二个子元素
- 26. Zen第n个元素
- 27. 从julia的数组中选择每第n个元素
- 28. 从Observable中获取每个第N个元素
- 29. 如何从阵列中删除每个第N个元素
- 30. 从数组中选择n个元素
非常感谢你的回答。我有一个输入为10元组,我必须从中获取元素。我想知道是否容易将元组分成2个不同的列表:首先是2个整数列表和8个字符串列表? – jason 2013-03-21 21:30:11
@ user1954132:要做到这一点,无论如何你都必须对元组进行模式匹配。如果你不能把输入作为一种不同的类型,你必须在某个时候对它进行模式匹配,这会有点尴尬。你可以通过用名称替换我的例子中的'_'来获取值 - 模式中的'_'只意味着你不关心那个位置的值。 – 2013-03-21 21:32:39
建议使用'!!'不是一个好主意,因为它是部分的,而且更糟糕的是建议使用列表通过索引访问项目。 [Vector's'!?'](http://hackage.haskell.org/packages/archive/vector/0.10.0.1/doc/html/Data-Vector.html#v:-33--63-)手很好。 – 2013-03-22 06:11:41