Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
haskell中元组列表上的递归_Haskell - Fatal编程技术网

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中使用了不同的名称,在复制时出错。这个嵌套的注释真的启发了我!谢谢