Печатайте строки подряд - PullRequest
0 голосов
/ 24 сентября 2010

У меня есть две функции:

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 (фактически этомой 5-й день в Хаскеле).Как мне написать функцию, которая получает [Char] в качестве входных данных и печатает две строки в качестве выходных?

Ответы [ 2 ]

2 голосов
/ 24 сентября 2010

Ввод / вывод должен быть выполнен в монаде IO. Чтобы прочитать строку, используйте действие getLine , а для печати используйте действие putStrLn , например

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

См. http://book.realworldhaskell.org/read/io.html, как использовать базовый ввод / вывод в Haskell.

1 голос
/ 24 сентября 2010

Во-первых, я бы переписал ваши функции следующим образом:

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

Или, если вам нужно поведение, чтобы каждое второе подчеркивание могло быть пропущено (например: upperString "_a__bc" == "__"), что-то вроде этого:

upperString ('_': _: xs) = '': upperString xs upperString ('': "") = "" upperString (_: xs) = '': upperString xsupperString "" = ""

Кстати, теперь вывод upperString отличается от определения функции в вашем описании, так как символы больше не заменяются пробелами, а просто удаляются.

Для вашегопроблема вывода: Вы должны сделать все выходные данные в монаде IO.На самом деле это не сложно, вы можете использовать блок do, чтобы покрыть это в обязательном порядке.Любое действие, которое может что-то сделать для среды, имеет специальный тип ввода-вывода, связанный с выходом, поэтому вы можете запускать их только внутри самой монады ввода-вывода или внутри блока 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...