haskell中元组列表上的递归
有没有一种递归的方法来做下面这样的事情haskell中元组列表上的递归,haskell,Haskell,有没有一种递归的方法来做下面这样的事情 updateOs2 :: [(Rotor, Int)] -> [(Rotor, Int)] updateOs2 [(a,x),(b,y),(c,z)] | x == 25 && y == 25 && z == 25 = [(a,0),(b,0),(c,0)] | x == 25 && y == 25 = [(a,0),(b,0),(c
updateOs2 :: [(Rotor, Int)] -> [(Rotor, Int)]
updateOs2 [(a,x),(b,y),(c,z)]
| x == 25 && y == 25 && z == 25 = [(a,0),(b,0),(c,0)]
| x == 25 && y == 25 = [(a,0),(b,0),(c,z+1)]
| x == 25 = [(a,0),(b,y+1),(c,z)]
| otherwise = [(a,x+1),(b,y),(c,z)]
我曾尝试过递归,但很困惑。因为一旦最后一个元素
z
被传递,列表将变为空,不能再返回到x
。我认为这应该有效
updateOs2 [] = []
updateOs2 ((a,x):xs)
| x == 25 = (a,0): (updateOs2 xs)
| otherwise = (a,x+1):xs
您是否计划拥有超过三对
(Rotor,Int)
的列表?如果没有,使用递归(这是处理任意长度列表的方法)。@chepner是的,只有三对你对每个元组做了不同的事情,所以使用递归没有什么意义。如果对每个元组应用相同的操作,那么它将非常有用;e、 g.data Foo=Foo(Rotor,Int)(Rotor,Int)(Rotor,Int)
。这并不完全相同(尽管尚不清楚OP是否在寻找相同的东西)。这将更新,比如说,(b,23)
到(b,24)
,即使a!=25如果a!=25
,(a,x+1)
被附加到列表的其余部分,而不进行任何递归调用,因此(b,23)
不会更新为(b,24)
。我在ghci中测试了它,它可以正常工作抱歉,是的,我更正了它。我在ghci中使用了不同的名称,在复制时出错。这个嵌套的注释真的启发了我!谢谢