Haskell堆栈或交互正在添加字符

Haskell堆栈或交互正在添加字符,haskell,Haskell,我正在用Haskell做我的第一步。我使用stack创建了一个项目,并将Main.hs更改为 module Main where my_fkt :: String -> String my_fkt input = show (length input) main :: IO () main = interact my_fkt 我通过stack build构建项目,通过stack exec firststeps exe运行项目,输入abcd并通过-D完成输入。在控制台中,我现在看到 a

我正在用Haskell做我的第一步。我使用stack创建了一个项目,并将Main.hs更改为

module Main where

my_fkt :: String -> String
my_fkt input = show (length input)

main :: IO ()
main = interact my_fkt
我通过stack build构建项目,通过stack exec firststeps exe运行项目,输入abcd并通过-D完成输入。在控制台中,我现在看到

abcd4%
百分比是倒转的。如果我使用包含无换行符的文本文件并执行more sample.txt | stack exec firststeps exe,我会看到


为什么在第二种情况下,我会得到一个额外的字符,什么是倒置的百分号?

这是因为interact的定义使用putStr而不是putStrLn

你可以看看源代码

为了解决您的问题,我将继续创建一个类似的函数

interact' :: (String -> String) -> IO ()
interact' f = do s <- getContents
                putStrLn (f s)
或者,如果你想把它混合起来,写一段更简洁的代码

interact' f = putStrLn =<< (f <$> getContents)
我不知道%是什么,也不知道它为什么会出现,我猜它是转义的CTRL-D

关于您关于附加不存在字符的第二个问题,我也不确定,但我猜这是\EOF


顺便说一句,你可以使用更多的testinput | wc-c进行检查,它应该产生与haskell程序相同的结果。

我相信这是你的shell的一个特性;添加了一个表示输出结束的字符,以便可以在bash中的行首打印下一个提示。您将看到打印的提示取代了%Try show length input++\n,以便在末尾添加新行。不过,请注意,交互方法很快就会变得困难。除非这个问题非常简单,否则我不推荐interact。也可以编写interact'f=interact++\n。F
interact' :: (String -> String) -> IO ()
interact' f = do s <- getContents
                putStrLn (f s)
interact' f = putStrLn =<< (f <$> getContents)