Haskell标志模式写入功能?

时间:2011-12-03 20:18:41

标签: haskell

我真的需要帮助在Haskell中编写这个函数,我甚至不知道从哪里开始。以下是规格:

定义一个函数flagpattern,它取一个正Int值大于或等于5并返回一个String,该String可以显示为维度n的以下“flag”模式,例如

Main> putStr (flagpattern 7)

#######  
##   ##  
# # # #  
#  #  #  
# # # #  
##   ##  
#######

3 个答案:

答案 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