让我们考虑一下函数: import Data.Char
convertStringToInt :: String -> Int
convertStringToInt s = convertStringToInt' s 1 0
where
convertStringToInt' [] _ res = res
convertStringToInt' (h:t) m res = convertStringToInt' t (m*10) (res + (((ord h) - 48)*m))
f :: String -> String
f s = (show . convertStringToInt)s
main = interact f
当我输入"1212"时,它不会发生任何事情。只是提示仍在等待。为什么?
interact
首先读取整个输入,然后打印将整个输入传递给函数的结果。除非工作函数只需要输入的初始部分,否则Haskell运行时需要读取直到输入结束。你的函数消耗整个字符串,所以这就是发生的事情。
因此,在完成输入之前,您不会得到结果(即Unix中的CTRL + D)。
Haskell交互函数已经有一个答案。默认情况下,IO 是惰性的。如果您希望函数逐行处理您的输入,您可以做的是使用 unline
函数:
interact (unlines . map (show . length) . lines)
使用辅助函数
eachLine :: (String -> String) -> (String -> String)
eachLine f = unlines . map f . lines
然后,您可以:
main = interact (eachLine inputLength)