List Haskell-递增失败

List Haskell-递增失败,list,haskell,auto-increment,List,Haskell,Auto Increment,我在这段代码中遇到了一个计数器递增的大麻烦。它不会增加。 编辑:现在可以正常工作了 你能告诉我问题出在哪里,我怎样才能解决它吗 replaceBasedIdx :: String -> [String] -> String -> String replaceBasedIdx findStr replaceStrList myText = replaceBasedIdxSub findStr replaceStrList myText 0 replac

我在这段代码中遇到了一个计数器递增的大麻烦。它不会增加。 编辑:现在可以正常工作了

你能告诉我问题出在哪里,我怎样才能解决它吗

replaceBasedIdx    ::  String  ->  [String]  ->  String  ->  String
replaceBasedIdx    findStr replaceStrList myText = replaceBasedIdxSub findStr replaceStrList myText 0

replaceBasedIdxSub  ::  String  ->  [String]  ->  String  -> Int -> String
replaceBasedIdxSub findStr replaceStrList myText counter = loop myText 0
  where
    loop [] _ = []
    loop myText counter =
      let (prefix, rest) = splitAt n myText
      in
        if findStr == prefix                                -- found an occurrence?
        then (replaceStrList !! counter) ++ loop rest (counter+1)   -- yes: replace it

        else head myText : loop (tail myText) counter              -- no: keep looking
    n = length findStr
增量在这段代码中工作得很好

为什么会这样

numStack :: [Integer]
numStack = [20, 45, 150, 85, 19, 31, 50, 74, 57]

sumStack :: Integer
sumStack = sumStackSub 0

sumStackSub :: Int -> Integer
sumStackSub counter = if (counter < (length numStack)) then
                            sumStackSub (counter + 1) + (numStack !! counter)
                         else
                            0   -- dummy value
numStack::[Integer]
numStack=[20,45,150,85,19,31,50,74,57]
sumStack::Integer
sumStack=sumStackSub 0
sumStackSub::Int->Integer
sumStackSub计数器=如果(计数器<(长度numStack)),则
sumStackSub(计数器+1)+(numStack!!计数器)
其他的
0—伪值
非常感谢你,穆奇


你好

正如注释中指出的,您不能对
计数器
进行变异,但您可以使用
计数器
的递增值作为参数调用
循环

replaceBasedIdx    ::  String  ->  [String]  ->  String  ->  String
replaceBasedIdx    findStr replaceStrList myText = replaceBasedIdxSub findStr replaceStrList myText 0

replaceBasedIdxSub  ::  String  ->  [String]  ->  String  -> Int -> String
replaceBasedIdxSub findStr replaceStrList myText counter = loop myText counter
  where
    loop [] _ = []
    loop myText c =
      let (prefix, rest) = splitAt n myText
      in
        if findStr == prefix                                -- found an occurrence?
        then (replaceStrList !! (counter+1)) ++ loop rest (counter+1)   -- yes: replace it

        else head myText : loop (tail myText) (counter+1)              -- no: keep looking
    n = length findStr

您的第二个示例有效,因为您正是这样做的,所以您将递增的
计数器
值传递给被调用的函数
sumStackSub

您知道
计数器
是不可变的吗?您是否知道
计数器+1
将返回一个值并且不会变异
计数器
?感谢您的回复!那么我如何增加计数器呢?在我的另一个代码中,它是s。我的问题请更新!在您的更新中,您不是在变异计数器,而是在创建一个新值并执行递归调用。不,您不需要递增的计数器,您需要将计数器作为参数传递给
循环