Карта новых строк в GHCi - PullRequest
2 голосов
/ 01 марта 2011

Простой вопрос, но я не могу понять это.У меня есть список, и я хочу распечатать каждый его элемент в отдельной строке.Я могу, например, сделать

map show [1..10]

, который распечатает их все вместе, но без перевода строки.Я думал сделать map (putStrLn $ show) [1..10], но это не сработает, потому что я просто вернул [IO()].Есть мысли?

Ответы [ 3 ]

9 голосов
/ 01 марта 2011

Разве в этих ответах слишком много внимания уделяется IO? Если вы хотите перемежать переводы строк, стандартная формула Prelude:

> unlines (map show [1..10])
"1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"

Это то, что вы хотите написать - в конце концов, новые строки - это символы, а не действия. Если у вас есть выражение для него, вы можете применить putStrLn или writeFile "Numbers.txt" непосредственно к этому. Итак, полная операция, которую вы хотите, выглядит примерно так:

putStrLn . unlines . map show

В ghci у вас будет

> (putStrLn . unlines . map show) [1,2,3]
1
2
3
6 голосов
/ 01 марта 2011

Вот моя любимая монадная команда, которая называется sequence :

sequence :: Monad m => [m a] -> m [a]

Поэтому вы можете полностью попробовать:

sequence_ . map (putStrLn . show) $ [1..10]

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

sequence_ . intersperse (putStrLn "")

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

6 голосов
/ 01 марта 2011

Попробуйте это: mapM_ (putStrLn . show) [1..10]

...