如何在haskell中使用putStr接受此函数?所以它在新行上显示列表中的每个单词??
unlines1 :: [String] -> String
unlines1 [] = []
unlines1 (l:ls) = l ++ (putStr('\n')) : unlines ls
答案 0 :(得分:4)
让我试着在答案所提供的更大空间中更清楚。
当您使GHCi评估某个值时,例如,
> "foo"
GHCi将试图向您展示这一价值。它通过确定该值的类型是否为Show
的实例来实现此目的。如果是,GHCi将打印show
为该值提供的显示字符串。对于字符串,show
将转义不可打印的字符,例如'\n'
。这意味着GHCi实际上做的更像是:
> putStrLn (show "foo")
这意味着
> "foo\nbar"
变为
> putStrLn (show "foo\nbar")
,根据字符串show
的定义,变为
> putStrLn "foo\\nbar"
与' \ n'逃过一劫。这就是GHCi的目的。你不能也不应该这样做。
另一方面,如果你想打印一个字符串,就像在中执行相当于echo
或puts
或{{1}的Haskell } ,然后您必须使用printf
操作来执行此操作。您可以使用的一项IO操作是IO
。
评估时
putStr :: String -> IO ()
GHCi将尝试评估> putStr "foo"
操作并显示结果。因为它是一个IO动作,GHCi旨在执行(执行)IO,在这种情况下打印一个字符串。
所以区别
IO ()
和
> "foo\nbar"
并不是说换行符在一个字符串中转义而在另一个字符串中没有转义。换行符始终是字面换行符。问题是前者显示了字符串的可检查版本(非printables被转义),后者实际上是打印字符串。