如何在haskell中使用putStr接受此函数?

时间:2015-10-15 19:45:56

标签: haskell

如何在haskell中使用putStr接受此函数?所以它在新行上显示列表中的每个单词??

unlines1                 :: [String] -> String
unlines1 [] = []
unlines1 (l:ls) = l ++ (putStr('\n')) : unlines ls

1 个答案:

答案 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的目的。你不能也不应该这样做。

另一方面,如果你想打印一个字符串,就像在中执行相当于echoputs或{{1}的Haskell } ,然后您必须使用printf操作来执行此操作。您可以使用的一项IO操作是IO

评估时

putStr :: String -> IO ()

GHCi将尝试评估> putStr "foo" 操作并显示结果。因为它是一个IO动作,GHCi旨在执行(执行)IO,在这种情况下打印一个字符串。

所以区别

IO ()

> "foo\nbar"

并不是说换行符在一个字符串中转义而在另一个字符串中没有转义。换行符始终是字面换行符。问题是前者显示了字符串的可检查版本(非printables被转义),后者实际上是打印字符串。