Я пытаюсь написать программу, которая позволяет пользователю создавать список строк, введя их по одному за раз и отображает список после каждого шага.Haskell IO создать список строк и отобразить его
Вот мой код до сих пор:
buildList :: [String] -> IO()
buildList arr = do
putStr "Enter a line:"
str <- getLine
if str == "" then
return()
else do
let newarr = arr : str
putStrLn ("List is now: " ++ newarr)
buildList newarr
listBuilder :: IO()
listBuilder = do
buildList []
listBuilder
начинает список пропускания в пустом списке, и я пытаюсь использовать рекурсию, так что код продолжает работать до тех пор, пока пользователь не введет пустой строка.
Ее не работает, любые идеи приветствуются
Вот нужный вход:
Enter a line: hello
List is now ["hello"]
Enter a line: world
List is now ["hello","world"]
Enter a line:
Ошибка:
Couldn't match type `Char' with `[String]'
Expected type: [[String]]
Actual type: String
In the second argument of `(:)', namely `str'
In the expression: arr : str
In an equation for `newarr': newarr = arr : str
EDIT:
Это зафиксировал его, благодаря ссылки и использование show
buildList :: [String] -> IO()
buildList arr = do
putStr "Enter a line:"
str <- getLine
if str == "" then
return()
else do
let newarr = arr++[str]
putStrLn ("List is now: " ++ show newarr)
buildList newarr
listBuilder :: IO()
listBuilder = do
buildList []
Это не только не работает, но и не компилируется **. Вы почти получили это; Мое предложение было бы переименовать второй 'arr' в нечто вроде' newarr' или 'arr'', чтобы избежать путаницы и конфликтов имен. –
это правильно, я совсем застрял! – benharris
Снова прочитайте ошибку компилятора. Он пытается вам помочь. Во всяком случае, мне потребовалось несколько незначительных исправлений, чтобы заставить его работать, поэтому я оставлю его как упражнение. Отправьте ответ, когда вы закончите ':)' –