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

Der*_*rek 1 recursion haskell tuples

这个功能的类型是 function :: Num a => ([Char],a) -> ([Char],a)

我对此函数的输入是类似的(".'*",0),函数通过添加200或400 的值来查找第一个'.''*'更新a,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?
Run Code Online (Sandbox Code Playgroud)

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

所需输入输出的示例:

Main> function ("./-", 0)
("-/-",200)
Run Code Online (Sandbox Code Playgroud)

要么

Main> function ("-/-", 0)
("-/-",0)
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏!如果不清楚,我会澄清一下.我觉得我正在以错误的方式解决这个问题.

Art*_*ius 9

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

    | otherwise = function(xs, a)
Run Code Online (Sandbox Code Playgroud)

相反,你想要更像的东西

    | otherwise = let (xss, b) = function(xs, a)
                              in (x:xss, b)
Run Code Online (Sandbox Code Playgroud)