Haskell: печатать Int из списка один за другим - PullRequest
2 голосов
/ 30 октября 2019

У меня короткий вопрос о том, что я хочу сделать в Хаскеле. Чего я в основном стремлюсь достичь, так это составить список целых чисел от 1 до определенного значения y. Как [1..y], и распечатать этот список с пробелами между каждым числом

Допустим, у меня есть [1..8]

Мой желаемый вывод ("_" представляет пробелы):

_1_2_3_4_5_6_7_8

Я немного поиграл с разными вещами, но без удачи

Это в основном то, что Iv 'получил до сих пор

printLst :: [Int] -> String
printLst (x:xs) = " " ++ putStr (show x) >> printLst xs

I'Я искал в Интернете, чтобы найти какое-либо решение, но я не нашел ничего, что помогло бы мне сделать это.

Помощь очень ценится

Ответы [ 3 ]

6 голосов
/ 30 октября 2019

Сначала определите функцию, которая преобразует Int в String, затем добавляет пробел к результату.

\x -> ' ' : show x

Теперь сопоставьте это со своим списком:

>  map (\x -> ' ' : show x) [1..8]
[" 1"," 2"," 3"," 4"," 5"," 6"," 7"," 8"]

Теперь нам просто нужно объединить все строки в одну:

> concat (map (\x -> ' ' : show x) [1..8])
" 1 2 3 4 5 6 7 8"

Это можно упростить с помощью функции concatMap:

> concatMap (\x -> ' ':show x) [1..8]
" 1 2 3 4 5 6 7 8"

, которая составляет основу дляMonad экземпляр для списков:

> [1..8] >>= (\x -> ' ' : show x)
" 1 2 3 4 5 6 7 8"

или даже более кратко, используя композицию функций

> [1..8] >>= (' ' :) . show
" 1 2 3 4 5 6 7 8"

Как только у вас будет последняя строка, сейчас вы можете беспокоитьсяо печати. ​​

> putStrLn $ [1..8] >>= (' ' :) . show
 1 2 3 4 5 6 7 8
3 голосов
/ 30 октября 2019

Ну, вы тут все путаете, прежде всего:

putStr :: String -> IO ()

И вы возвращаете String, так что вам не нужно это использовать. Кроме того, у вас нет паттерна для [] и списка синглтонов, вы можете добавить их, чтобы получить лучший результат, подобный этому:

printLst :: [Int] -> String
printLst [] = ""
printLst [x] = (show x)
printLst (x:xs) = (show x) ++ " " ++ printLst xs

Если вы хотите использовать функцию IO (), используйте ее в основномфункция:

main = do
  putStrLn (printLst [1..8])
0 голосов
/ 30 октября 2019

Это проблема обработки списка. Для пустого списка мы можем вернуть пустую строку, для непустого списка мы можем сначала получить пробел, затем show этого элемента, а затем выполнить рекурсию в остальной части этого списка, например:

prefixSpace :: Show a => [a] -> String
prefixSpace [] = ""
prefixSpace (x:xs) = ' ' : show x ++ prefixSpace xs

Или как шаблон "сгиба":

prefixSpace :: Show a => [a] -> String
prefixSpace = foldr (\x -> ((' ' : show x) ++)) ""

Это не напечатает строку. Для этого вам нужно putStrLn :: String -> IO (), но, как показывает подпись, если вы putStrLn some_string, вы работаете с IO ().

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