我真的需要帮助在Haskell中编写这个函数,我甚至不知道从哪里开始。以下是规格:
定义一个函数flagpattern,它取一个正Int值大于或等于5并返回一个String,该String可以显示为维度n的以下“flag”模式,例如
Main> putStr (flagpattern 7)
#######
## ##
# # # #
# # #
# # # #
## ##
#######
答案 0 :(得分:1)
假设你想要一个用4行包围的“X”,你需要编写一个给定坐标(x,y)返回该位置应该是什么字符的函数:
coordinate n x y = if i == 0 then 'X' else ' '
(此版本只输出最左边的X',修改它,记住索引从0开始)
现在您希望它们很好地排列在矩阵中,使用链接文本中描述的list comprehension。
答案 1 :(得分:1)
您应该从问题定义开始:
main :: IO ()
main = putStr . flagPattern $ 7
然后,你应该问问自己有多少点旗:
flagPattern :: Int -> String
flagPattern = magic $ [1..numberOfDots]
然后,magic
函数的(硬)部分应决定每个点是
还是#
:
partOfMagic ...
| ... = "#" -- or maybe even "#\n" in some cases?
| otherwise = " "
然后,您可以将部分连接成一个字符串并获得答案。
答案 2 :(得分:1)
从类型签名开始。
flagpattern :: Int -> String
现在将问题分解为子问题。例如,假设我告诉您生成7号标志模式的第2行。你会写:
XX XX
或者7号标志模式的第3行将是
X X X X
假设我们有一个可以产生给定行的函数。然后我们有
flagpattern :: Int -> String
flagpattern size = unlines (??? flagrow ???)
flagrow :: Int -> Int -> String
flagrow row size = ???
unlines
获取字符串列表并将其转换为单个字符串,并在列表的每个元素之间添加换行符。看看您是否可以定义flagrow
,并使其适用于任何给定的行和大小。然后,看看您是否可以使用flagrow
来定义flagpattern
。