如何在haskell中的字符串列表周围传递一个字符串

时间:2015-10-28 19:44:37

标签: haskell

如何让这段代码接受字符串列表并在外部输出一个框架。我理解这个概念,但却无法在最终的帧函数中执行代码。

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

1 个答案:

答案 0 :(得分:1)

我认为frame的类型应该是frame :: String -> IO () - 它需要一个字符串a将“框架”版本放到stdout。然后,您不需要map putStrLn,只能使用putStrLn

现在,请考虑以下这一行:

putStrLn (bar m) ++ "\n" ++ textshown ++ "\n" ++ (bar m)

您正在调用putStrLn (bar m),然后尝试将一些内容添加到结果中(提示:使用括号或$)。