2017-04-02 111 views
1

下面的代码在某些情况下给我一个堆栈溢出错误(例如hosum (\x->x `mod` 3) 1000),我不明白为什么。任何人都可以向我解释这个吗? (我是Haskell的新手,我很感激任何帮助:))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 

回答

3

堆栈溢出很可能是由无限递归造成的。你的卫兵是和n <= 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捕获那一个。

+0

好的,我明白了。非常感谢你:) –

+0

我第二次删除'hs f 0 0'的情况。看起来很有趣,作为一个基本的例子,当每个递归调用中'n,m'增加_(增加1)。 – chi