Во-первых, я бы переписал ваши функции следующим образом:
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.