如何在字符串周围包装字符?

时间:2015-11-09 17:30:16

标签: string haskell

我们已经进行了练习,我们必须使用用户输入的字符来“框架”字符串。例如:

*******
* 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。:我怎么能这样做,所以它可以采取任何角色?)

1 个答案:

答案 0 :(得分:3)

我建议你解决一个更简单的更通用的问题,并考虑如何在你的情况下使用它

wrap :: a -> [a] -> [a]
wrap x xs = x:xs++[x]

现在,您可以首先将此问题应用于xs为行且x = *的每一行。其次你可以认为你的xs是行,x =“*****”(使用正确的长度)。如果您知道并允许使用map,则使用每行的换行,然后对结果进行二次换行。这将是一个班轮。