Как разделить введенную пользователем строку пробелами n в Haskell IO - PullRequest
0 голосов
/ 29 ноября 2018

Я хочу попросить пользователя о предложении, а затем вернуть предложение обратно, но со словами в отдельных строках.

Например, если пользователь вводит "hello I am tall", компьютер возвращает:

hello,
I 
am
tall

Я попытался немного начать, но не знаю функции или чего-то, что могуиспользуйте, чтобы попытаться отделить предложение.Мой код пока:

 displayWords ::IO ()
 displayWords = do putStr "Please enter a line of text"
              x <- getLine
              mapM print x

Я получаю сообщение об ошибке:

Не удалось сопоставить тип '[()] с' () '

РЕДАКТИРОВАТЬ: Еще одна побочная вещь ... использование mapM_ print (words x) исправляет то, что я хочу, но есть ли способ напечатать это без кавычек?

EDIT2: Еще одна вещь ... Кто-то вкомментарии помогли ответить на предыдущее редактирование, но если я изменил формат этого файла на

displayWords:: String -> IO Int()
displayWords s = do
     mapM_ putStrLn s
     return (length s)

, я получу сообщение об ошибке

Невозможно сопоставить тип 'Char' с '[Char] '

Почему putStrLn здесь не работает?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Вам нужна функция words, чтобы разбить строку на отдельные слова.

Кто-то предложил mapM_ print (words x), но, поскольку каждое слово является строкой, использование print обернет его в кавычки, которыеты не хочешьТак что попробуйте

mapM_ putStrLn (words x)
0 голосов
/ 29 ноября 2018

Использование mapM_.

  • mapM print возвращает список, результат вызова print для каждого элемента, но поскольку print возвращает только (), то есть[()] не очень значимый.

    -- here, b = ()
    mapM :: Monad m => (a -> m b) -> [a] -> m [b]
    
  • mapM_ print отбрасывает результат каждого вызова:

    mapM_ :: Monad m => (a -> m b) -> [a] -> m ()
    

displayWordsдолжен иметь тип IO (), а тип do -блока является типом его последнего оператора, поэтому mapM приводит к ошибке типа.

Другим способом было бы игнорироватьрезультат функции, такой как mapM, путем добавления оператора, который ничего не делает.

do putStr "..."
   x <- getLine
   mapM print x
   return ()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...