交互函数不停地等待.哈斯克尔



让我们考虑一下函数: 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)

最新更新