Мне нравится разбирать строки на Python, просто вставляя их в интерпретатор.
>>> s = """Adams, John
... Washington,George
... Lincoln,Abraham
... Jefferson, Thomas
... """
>>> print "\n".join(x.split(",")[1].replace(" ", "")
for x in s.strip().split("\n"))
John
George
Abraham
Thomas
Это прекрасно работает с интерпретатором Python, но я хотел бы сделать это с помощью Haskell/GHCi. Проблема в том, что я не могу вставлять многострочные строки. Я могу использовать getContents с символом EOF, но я могу сделать это только один раз, так как символ EOF закрывает стандартный ввод.
Prelude> s <- getContents
Prelude> s
"Adams, John
Adams, John\nWashington,George
Washington,George\nLincoln,Abraham
Lincoln,Abraham\nJefferson, Thomas
Jefferson, Thomas\n^Z
"
Prelude> :{
Prelude| putStr $ unlines $ map ((filter (`notElem` ", "))
Prelude| . snd . (break (==','))) $ lines s
Prelude| :}
John
George
Abraham
Thomas
Prelude> x <- getContents
*** Exception: <stdin>: hGetContents: illegal operation (handle is closed)
Есть ли лучший способ сделать это с помощью GHCI? Примечание. Мое понимание getContents (и Haskell IO в целом), вероятно, сильно нарушено.
ОБНОВЛЕНО
Я буду играть с ответами, которые я получил. Вот некоторые вспомогательные функции, которые я сделал (плагиат), которые имитируют цитирование Python """
(заканчивая """
, а не начиная) из ответа ephemient.
getLinesWhile :: (String -> Bool) -> IO String
getLinesWhile p = liftM unlines $ takeWhileM p (repeat getLine)
getLines :: IO String
getLines = getLinesWhile (/="\"\"\"")
Чтобы использовать ответ AndrewC в GHCi -
C:\...\code\haskell> ghci HereDoc.hs -XQuasiQuotes
ghci> :{
*HereDoc| let s = [heredoc|
*HereDoc| Adams, John
*HereDoc| Washington,George
*HereDoc| Lincoln,Abraham
*HereDoc| Jefferson, Thomas
*HereDoc| |]
*HereDoc| :}
ghci> putStrLn s
Adams, John
Washington,George
Lincoln,Abraham
Jefferson, Thomas
ghci> :{
*HereDoc| putStr $ unlines $ map ((filter (`notElem` ", "))
*HereDoc| . snd . (break (==','))) $ lines s
*HereDoc| :}
John
George
Abraham
Thomas