我有这个自定义的IO() Triangle
,它将三角形的每一行作为列表中的一个元素:
import Data.List ( intersperse )
type Triangle = Char -> Int -> [String]
centeredTriangle :: Triangle
centeredTriangle c n = [replicate (n-i) ' ' ++ intersperse ' ' (replicate i c) | i <- [0 .. n]]
输出:
Ok, one module loaded.
ghci> centeredTriangle '*' 6
[" "," *"," * *"," * * *"," * * * *"," * * * * *","* * * * * *"]
当我运行我的主要功能时,我unlines
会像这样打印出三角形:
triangles :: Int -> Int -> Int -> IO()
triangles a b c = do
putStr $ unlines $ centeredTriangle '*' a
putStr $ unlines $ centeredTriangle '*' b
putStr $ unlines $ centeredTriangle '*' c
输出:
ghci> triangles 1 2 3
*
*
* *
*
* *
* * *
我想在同一行打印三角形,如下所示:
ghci> triangles 1 2 3
*
* * *
* * * * * *
我意识到这可能是比我最初预期的更大的任务,但我的第一个想法是使用centeredTriangle
获取每个三角形的底线(列表的最后一个元素),并将它们放在一个新字符串中,然后我将其作为新字符串列表中的最后一个元素。我想如果我为每个元素(从最后一个元素开始)一直到顶部都这样做,我可以使用我的主要功能在同一行中打印三角形。我如何实现这一目标?