Haskell新行无效

时间:2015-03-17 00:04:17

标签: haskell newline

现在正在试图让新生产线运转约20分钟,但它总是在GHCI中显示为单行。

以下是我进入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"

2 个答案:

答案 0 :(得分:4)

要按原样打印字符串,而不转义特殊字符,请使用:

putStr string

putStrLn string

如果你想在最后添加额外的换行符。在你的情况下,你可能正在寻找

putStr (displayFilm (....))

为什么需要这个?在GHCi中,如果您评估表达式s,结果将被打印为好像正在运行print s(除非它具有类型IO something - 请忘记这种特殊情况)。如果e是字符串,print 将转义所有特殊字符并输出结果。这是因为print意味着输出一个字符串,其语法遵循Haskell表达式中的字符串。对于数字,这是通常的十进制表示法。对于字符串,我们会获得引号和转义字符。

答案 1 :(得分:2)

当您在GHC中键入表达式时,它会使用print显示它。在字符串上调用print会显示其内容,但不会评估转义序列:

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

注意引号。

要实际打印字符串,请使用putStrputStrLn(后者会附加换行符)。

> putStr "line1\nline2"
line1
line2