我有两个功能:
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]
作为输入的函数并将两个字符串打印为输出?
答案 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章节。