在Haskell中,如何递归操作元组并将字符预先添加到元组中的第一个元素?

时间:2009-11-02 00:33:21

标签: haskell recursion tuples

此功能的类型为function :: Num a => ([Char],a) -> ([Char],a)

我对此功能的输入类似于(".'*",0),函数找到第一个'.''*'并更新a,向{{添加200或400 1}}的值取决于首先被替换的字符。一旦更改了某些内容,字符列表的其余部分将附加到末尾(只更改了一个字符)。如果未更改头部字符,则处理列表的其余部分,但保留头部字符。

我相信前两个保护语句是正确的,但是我不知道如何使这个功能递归,以便检查列表中的整个字符不变。

a

基本上,当函数到达时,我需要处理字符列表的其余部分,但是还需要返回未更改的字符。

所需输入输出的示例:

function ([], a) = ([], a)
function ((x:xs), a)
    | x == '.' = ('-':xs, a+200)
    | x =='*' = ('-':xs, a+400)
    | otherwise = function(xs, a) --how do I put the unchanged x before xs without processing it?

Main> function ("./-", 0)
("-/-",200)

非常感谢任何帮助!如果不清楚,我会澄清一下。我觉得我是以错误的方式解决这个问题。

1 个答案:

答案 0 :(得分:9)

当你这样做时,你会忘记function :: Num a => ([Char],a) -> ([Char],a)

    | otherwise = function(xs, a)

相反,你想要更像

的东西
    | otherwise = let (xss, b) = function(xs, a)
                              in (x:xss, b)