【发布时间】:2018-12-10 23:10:50
【问题描述】:
我正在努力学习Learn You a Haskell,这对我很有好处。我目前在第 9 章的文件和流部分。出于某种原因,当我尝试将代码通过管道传输到一个示例 Haskell 程序中时,我没有得到与本书相同的输出。在 Windows 上使用 ConEmu for Linux 命令。例如,我的程序只打印出少于 10 个字符的字符串,代码如下(short_lines.hs):
main = interact $ unlines . filter ((<10) . length) . lines
我将传递这个文件(short_long.txt):
i'm short
so am i
i am a loooooooooong line!!!
yeah i'm long so what hahahaha!!!!!!
short line
loooooooooooooooooooooooooooong
short
命令如下:
cat short_long.txt | runhaskell short_lines.hs
这是我的输出:
so am i
short
书上说输出如下:
i'm short
so am i
short
我相信这与换行符的处理有关,但我无法弄清楚这一点,因为行应该在过滤之前删除换行符。它适用于手动输入,但不适用于管道。为什么我得到不同的输出?难道我做错了什么?我尝试在 Atom 编辑器中删除尾随换行符,但它没有改变任何东西。任何关于为什么我没有得到预期结果以及我可以做些什么来获得预期结果的帮助将不胜感激。谢谢!
【问题讨论】:
-
很奇怪。检查尾随空格。检查
'是否为标准报价。尝试main = interact $ unlines . map (show . length) . lines打印所有行的长度。 -
当给定有问题的输入时,程序
main = getContents >>= print的输出是什么? -
这真的很有帮助。我发现输出是
"i'm short\r\nso am i\r\ni am a loooooooooong line!!!\r\nyeah i'm long so what hahahaha!!!!!!\r\nshort line\r\nloooooooooooooooooooooooooooong\r\nshort\r\n"。然后我做了一些搜索,发现了 Windows 回车与 Unix 的区别。谢谢!