如何让这段代码接受字符串列表并在外部输出一个框架。我理解这个概念,但却无法在最终的帧函数中执行代码。
minusdots :: Int -> String
minusdots 1 = "-."
minusdots n
| n > 1 = "-." ++ (minusdots (n-1))
| otherwise = error "please enter greater than 1"
bar :: Int -> String
bar n
| even n = minusdots (div n 2)
| otherwise = (minusdots (div n 2)) ++ ['-']
frame :: [String] -> IO String
frame text = map putStrLn (bar m) ++ "\n" ++ textshown ++ "\n" ++ (bar m)
where
textshown = "- " ++ text ++ " -"
m = length textshown
我整天都在研究这个并提出这个问题但是我还需要解决一些问题1.当我将边框字符串传递给frameM函数时,如果我要传递说“SS”就有了我可以将S'S框架放在彼此的顶部,而不是并排,所以我在第一个参数中放入的字母越多,框架的总周长越大?继承人我所做的:
minusdots :: Int -> String -> String
minusdots 1 a = a
minusdots n a
| n > 1 = a ++ (minusdots (n-1) a)
| otherwise = error "argument not addmissible"
bar :: String -> Int -> String
bar s n
| even n = minusdots (div n 2) s
| otherwise = (minusdots (div n 2) s) ++ s
frameM :: String -> String -> String
frameM a text = (bar a m) ++ "\n" ++ textshown ++ "\n" ++ (bar a m)
where
textshown = b ++ text ++ b
m = length textshown
b = a
答案 0 :(得分:1)
我认为frame
的类型应该是frame :: String -> IO ()
- 它需要一个字符串a将“框架”版本放到stdout
。然后,您不需要map putStrLn
,只能使用putStrLn
。
现在,请考虑以下这一行:
putStrLn (bar m) ++ "\n" ++ textshown ++ "\n" ++ (bar m)
您正在调用putStrLn (bar m)
,然后尝试将一些内容添加到结果中(提示:使用括号或$
)。