递归haskell函数在交互式会话中永远挂起

时间:2015-04-11 22:44:33

标签: haskell recursion

我有一个递归函数,用于绘制ASCII艺术中的一些图片。

非常简单
type Picture = [[Char]]
white :: Picture
white = ["......",
         "......",
         "......",
         "......",
         "......",
         "......"]

black = ["######",
         "######",
         "######",
         "######",
         "######",
         "######"]

printPicture :: Picture -> IO ()
printPicture = putStr . concat . map (++"\n")

使用这些块我想构建一个游戏板。我已经定义了一些功能,它们是:

blackinWhite :: Integer -> Integer -> Picture
blackinWhite n m | n==1 && m==1 = black
                 | n==1 = white
                 | n==m = black `beside` blackinWhite (n-1) m
                 | otherwise = white `beside` blackinWhite (n-1) m

blackinWhite' :: Integer -> Integer -> Picture
blackinWhite' n m | n==1 && m==1 = black
                  | n==1 = white
                  | n==m = black `above` blackinWhite' (n-1) m
                  | otherwise = white `above` blackinWhite' (n-1) m

diagonalrug :: Integer -> Integer -> Picture
diagonalrug n m | m==1 = blackinWhite n m
                | otherwise = blackinWhite n m `above` diagonalrug n (m-1)

antidiagrug :: Integer -> Integer -> Picture
antidiagrug n m | m==1 = blackinWhite' n m
                | otherwise = antidiagrug n (m-1) `beside` blackinWhite' n m

crossedrug :: Integer -> Integer -> Picture
crossedrug n m | dimn /= 0 || dimm /= 0= error("Come back later")
               | otherwise = diagonalrug dimn dimm --((diagonalrug dimn dimm) `beside` (antidiagrug dimn dimm)) `above` ((antidiagrug dimn dimm) `beside` (diagonalrug dimn dimm))                                                           
               where
                 dimn = mod n 2
                 dimm = mod m 2

如果我在交互式会话中这样做:

*Main> diagonalrug 2 2

程序挂起,我的电脑冻结了。如果我直接执行otherwise之后的语句,结果将毫无问题地给出。为什么我调用函数crossrug ghci崩溃?

(我没有提供函数abovebeside,因为它们只是连接两个应该从上下文中清楚的图片。)

1 个答案:

答案 0 :(得分:3)

只需执行即可。

你用2 2调用它,它转到其他地方并调用diagonalrug 0 0,而diagonalrug 0 -1依次转到从不终止的else子句,因为它调用m所以{{1绝不是1(它一直是负面的)。

diagonalrug缺少该情况的停止条件。