我试图理解为什么我的代码不工作:
writeRow :: Int -> IO()
writeRow x = putStr(concat (replicate x "* "))
triangle :: Int -> IO()
triangle x = do
writeRow x
putStr ""
triangle x-1
我的想法是,writeRow创建了一行x次"* ",所以如果x = 4,三角形4会写
* * * *
由于三角形被递归地称为x -1,下一行将是:
* * *
等等……直到:
* * * *
* * *
* *
*
但是它只是在一行中输出:
* * * * * * * *
有什么问题吗?: D
putStr
只打印字符串,它不写一个新的行,你应该使用putStrLn
。而且你应该使用triangle (x-1)
与x-1
括号部分,并指定一个三角形的递归的基本情况:
writeRow :: Int -> IO()
writeRow x = putStr(concat (replicate x "* "))
triangle :: Int -> IO()
triangle x | x <= 0 = pure ()
triangle x = do
writeRow x
putStrLn ""
triangle (x-1)
通过这些修改,我们得到:
Prelude> triangle 4
* * * *
* * *
* *
*