以下代码在某些情况下(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
答案 0 :(得分:3)
堆栈溢出可能是由无限递归引起的。你的警卫是m <= n
和n <= m
;对于每个n
和m
,其中一个始终是真的。永远不会到达otherwise
,递归永远不会终止。你可能认为你的警卫是m < n
和n < 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
抓住了那个。