连续打印字符串

时间:2010-09-23 21:14:12

标签: haskell io

我有两个功能:

lowerString :: [Char] -> [Char]
lowerString = filter (/='_')

upperString :: [Char] -> [Char]
upperString [] = []
upperString (x:xs) 
    | x == '_' = x : upperString (tail xs)
    | otherwise = ' ' : upperString(xs)

如果我将它们应用于“_A_B_CDEF”:

upperString "_A_B_CDEF"会返回___
lowerString "_A_B_CDEF"会返回ABCDEF
(没有空格)

这个想法是要有“上升”的字母(需要更大的练习)。

我从未使用Haskell输入/输出(实际上这是我在Haskell的第5天)。如何编写一个接收[Char]作为输入的函数并将两个字符串打印为输出?

2 个答案:

答案 0 :(得分:2)

I / O需要在IO monad中完成。要阅读字符串use the getLine action,并打印它,use the putStrLn action,例如

main :: IO ()
main = do
  theInput <- getLine
  putStrLn (upperString theInput)
  putStrLn (lowerString theInput)

请参阅http://book.realworldhaskell.org/read/io.html了解如何在Haskell中使用基本I / O.

答案 1 :(得分:1)

首先,我会像这样重写你的函数:

lowerString :: String -> String
upperString :: String -> String
lowerString = filter (/= '_')
upperString = filter (== '_')

或者,如果您需要这种行为,可能会跳过每一个下划线(例如:upperString "_a__bc" == "__"),如下所示:

upperString('_':_:xs)='':upperString xs    upperString('':“”)=“”    upperString(_:xs)='':upperString xs    upperString“”=“”

BTW,现在upperString的输出与描述中的函数定义不同,因为字符不再被空格替换,而只是被剥离。

对于输出问题:您必须在IO monad中执行所有输出。这并不是很困难,您可以使用do块来强制执行此操作。任何可能对环境起作用的操作都会在输出中附加特殊类型IO,因此您只能在IO monad本身或do块内运行它们:

printStrings :: String -> IO () -- () is empty value
printStrings s = do
  putStrLn $ upperString s --This will be executed, like in an imperative language
  putStrLn $ lowerString s

考虑阅读关于简单IO的this wikibooks章节。