Haskell项目使用stack/interact时字符计数异常及特殊符号咨询
解答你的Haskell程序问题
我来帮你拆解这两个问题:
1. 为什么管道输入时字符计数多1?
原因出在more命令的行为上:
- 当你直接在终端输入
abcd然后按<CTRL>-D时,程序接收到的输入就是纯字符串"abcd"(没有末尾的换行符),所以length input返回4。 - 而当你用
more sample.txt输出到管道时,如果sample.txt本身没有换行符,more会自动在输出的末尾添加一个换行符。这时候程序接收到的输入是"abcd\n"(字符串加一个换行符),length计算自然是5。
如果你想验证这一点,可以用cat代替more试试:cat sample.txt | stack exec firststeps-exe,这时候如果sample.txt确实没有换行,程序应该会输出4——因为cat不会额外添加换行符。
2. 反向%符号是什么?
这个是shell的提示符标记,用来提示你当前输出行没有以换行符结尾:
- 你的程序
interact my_fkt会把输入处理后直接输出结果,也就是show (length input),这个结果是一个数字字符串(比如"4"或"5"),但它没有包含末尾的换行符。 - 当程序输出结束后,shell会直接在当前行显示提示符(你的shell提示符是
%),但因为前一行没有换行,shell会把提示符显示成反向(或高亮)的样式,用来区分这不是程序输出的内容,而是shell的提示符,同时提示你当前行的输出没有正常结束。
如果想让输出更整洁,可以修改my_fkt,在结果后面加一个换行符:
my_fkt input = show (length input) ++ "\n"
这样程序输出会以换行结尾,shell提示符就会正常显示在下一行,不会出现反向的%了。
内容的提问来源于stack exchange,提问作者Achim
相关产品推荐
相关产品推荐

