1

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

我对这个函数的输入是这样(".'*",0)的,函数找到第一个'.'or'*'和更新a,根据首先替换的字符将 200 或 400 添加到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)

或者

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

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

4

1 回答 1

9

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

    | otherwise = function(xs, a)

相反,你想要的东西更像

    | otherwise = let (xss, b) = function(xs, a)
                              in (x:xss, b)
于 2009-11-02T00:59:57.207 回答