haskell程序中的无限循环

时间:2017-04-02 17:58:27

标签: haskell

以下代码在某些情况下(ex hosum (\x->x `mod` 3) 1000)给出了堆栈溢出错误,我不明白为什么。谁有人向我解释这个? (我是Haskell的新手,我很感激任何帮助:))

 hosum :: (Int -> Int) ->  (Int -> Int)
    hosum f  = (\x -> hs f x (- x))
            where hs :: (Int -> Int) -> Int -> Int -> Int
                  hs f 0 0 = f 0
                  hs f n m
                          | m <= n 
                          = f m + hs f n (m+1)
                          | n <= m 
                          = f n + hs f (n+1) m
                          | otherwise
                          = 0

1 个答案:

答案 0 :(得分:3)

堆栈溢出可能是由无限递归引起的。你的警卫是m <= nn <= m;对于每个nm,其中一个始终是真的。永远不会到达otherwise,递归永远不会终止。你可能认为你的警卫是m < nn < m

因此,hs应为

hs f 0 0 = f 0
hs f n m | m < n     = f m + hs f n (m + 1)
         | m > n     = f n + hs f (n + 1) m
         | otherwise = 0

由于最后一个警卫,你甚至可以删除模式hs f 0 0; otherwise抓住了那个。