2015-03-17 3 views
0

Прошло около 20 минут, пытаясь получить новую линию, однако она всегда отображается в GHCI как одна строка.Haskell новая строка не работает

Вот что я вхожу в GHCi:

displayFilm ("Skyfall",["Daniel Craig", "Judi Dench", "Ralph Fiennes"], 2012, ["Bill", "Olga", "Zoe", "Paula", "Megan", "Sam", "Wally"]) 

Вот что напечатано:

"Skyfall----------\n Cast: Daniel Craig, Judi Dench, Ralph Fiennes\n Year: 2012\n Fans: 7\n"

displayList :: [String] -> String 
displayList [] = "" 
displayList [x] = x ++ "" ++ displayList [] 
displayList (x:xs) = x ++ ", " ++ displayList xs 


displayFilm :: Film -> String 
displayFilm (title, cast, year, fans) = 
    title ++ "----------" ++ 
    "\n Cast: " ++ (displayList cast) ++ 
    "\n Year: " ++ (show year) ++ 
    "\n Fans: " ++ show (length fans) ++ "\n" 
+4

Если я вижу еще один вопрос об этом назначении, я оборвусь ... – Jubobs

+1

Просто рад, что кто-то раздает задание, которое помогает людям узнать Haskell. : P –

ответ

4

Чтобы напечатать строку, как она есть, без экранирования специальных символов, использование:

putStr string 

или

putStrLn string 

если вы хотите дополнительный символ новой строки в конце. В вашем случае вы, вероятно, ищете

putStr (displayFilm (....)) 

Зачем это необходимо? В GHCi, если вы оцениваете выражение s, результат будет напечатан, как если бы он выполнялся print s (если у него нет типа IO something - забудьте об этом специальном случае). Если e является строкой, printвыдает все специальные символы и выводит результат. Это связано с тем, что print предназначен для вывода строки, синтаксис которой соответствует выражению Haskell. Для чисел это обычное десятичное обозначение. Для строк мы получаем кавычки и экранированные символы.

+0

Есть ли способ, которым я могу использовать «\ n»? – kmil

+0

@kmil Вы можете использовать его как: 'putStr" aa \ nbb "'. – chi

+0

Я почти уверен, что вы имели в виду ** с ** побегом специальных символов, а не без. –

2

Когда вы вводите выражение в GHC, оно отображает его с помощью print. Вызов print на строке показывает ее содержание, но не оценивает управляющие последовательности:

> print "line1\nline" 
"line1\nline2" 

Обратите внимание на кавычки.

Чтобы на самом деле напечатать строку, используйте putStr или putStrLn (последняя добавит новую строку).

> putStr "line1\nline2" 
line1 
line2 
Смежные вопросы