我们已经进行了练习,我们必须使用用户输入的字符来“框架”字符串。例如:
*******
* AAA *
*A A*
*AAAAA*
*A A*
*A A*
*******
我之前已经定义过字符串来表示charecter中的字母到字符串,还有一个操作它的大小的函数,简单地把它作为'stretch'。我试图首先用星号包围这些字符串并尝试获取输出,如上例所示,但我一直收到类型错误。我现在能够在终端中逐行(如下所示)执行此操作,因为我之前会显示但是没有运气将它实现到函数中(也在下面)...有什么建议吗?
解释器上的逐行代码:
EX01> map(\x-> "*" ++ x ++ "*")(letter 'a')
["* AAA *","*A A*","*AAAAA*","*A A*","*A A*"]
EX01> top_and_bottom $$
["*******","* AAA *","*A A*","*AAAAA*","*A A*","*A
A*","*******"]
EX01> map(\x-> x ++ "\n") $$
["*******\n","* AAA *\n","*A A*\n","*AAAAA*\n","*A A*\n","*A >A*\n","*******\n"]
EX01> concat $$
"*******\n* AAA *\n*A A*\n*AAAAA*\n*A A*\n*A A*\n*******\n"
EX01> putStr$$
*******
* AAA *
*A A*
*AAAAA*
*A A*
*A A*
*******
我尝试将其实现为一个函数:
stars :: Int -> String
stars 0 = ""
stars n = '*':(stars (n-1))
top_and_bottom :: [String] -> [String]
top_and_bottom x = (fringe : x) ++ [fringe]
where
fringe = (stars (length (head x)))
framestar :: [String] -> [String]
framestar x = putStr(concat(top_and_bottom(map(\x -> "*" ++ x ++ "*")[x])))
(P.S。:我怎么能这样做,所以它可以采取任何角色?)
答案 0 :(得分:3)
我建议你解决一个更简单的更通用的问题,并考虑如何在你的情况下使用它
wrap :: a -> [a] -> [a]
wrap x xs = x:xs++[x]
现在,您可以首先将此问题应用于xs为行且x = *
的每一行。其次你可以认为你的xs是行,x =“*****”(使用正确的长度)。如果您知道并允许使用map
,则使用每行的换行,然后对结果进行二次换行。这将是一个班轮。