putStrLn IO () ошибка при попытке отобразить список - PullRequest
0 голосов
/ 06 марта 2019

Я играл с созданием пользовательских списков отображения.Концепция действительно проста, но я продолжаю получать ошибку IO ().Мой код:

displayList :: [Int] -> IO()
displayList [] = putStrLn ""
displayList (firstUnit:theRest) =  putStrLn (show firstUnit ++ "\n" ++ 
                                   displayList theRest)

Код ошибки, который я получаю:

• Couldn't match expected type ‘[Char]’ with actual type ‘IO ()’
• In the second argument of ‘(++)’, namely ‘(displayList theRest)’
  In the first argument of ‘putStrLn’, namely
    ‘((show firstUnit) ++ (displayList theRest))’
  In the expression:
    putStrLn ((show firstUnit) ++ (displayList theRest))

Конкретная часть строки, которая получает ошибку, это displayList theRest, а не putStrLn ((show firstUnit) ++ часть.

Мне кажется, я понимаю, что происходит: когда в строке с ошибкой вызывается displayList theRest, он в конечном итоге после нескольких рекурсивных вызовов может вернуть тип IO () из строки displayList [] = putStrLn "" который не поддерживается как ввод в функции putStrLn.Кто-нибудь знает способ решить эту проблему?

1 Ответ

4 голосов
/ 06 марта 2019

Проблема

Проблема с вашим кодом довольно очевидна: как говорит вам компилятор, вы пытаетесь объединить строку (((show firstUnit) ++) с IO() (типом возврата вашегоfunction)

Solution

Решение может принимать два пути: либо вам нужна функция, которая возвращает всю строку, а затем печатает все в одном, либо просто рекурсивно выводите ее на печать.Я имею в виду:

Возвращение строки

displayList :: [Int] -> IO()
displayList = putStrLn . helper
  where
    helper :: [Int] -> String
    helper [] = ""
    helper (n:ns) = show n ++ "\n" ++ helper ns

Этот подход работает хорошо, но я считаю, что он не аккуратный и не ясный.

Лучшая версия

displayList' :: [Int] -> IO()
displayList' [] = putStrLn ""
displayList' (n:ns) =  putStrLn (show n) >> displayList' ns

Думаю, вы видите, как эту версию легче читать.Также обратите внимание, что print :: Show a => a -> IO() работает точно так же, как putStrLn . show

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