Haskell交互功能

20 haskell

我是Haskell的新手并且在interact功能方面存在问题.这是我的示例程序:

main :: IO ()
main = interact inputLength

inputLength :: String -> String
inputLength input = show $ length input
Run Code Online (Sandbox Code Playgroud)

它编译但是在运行时不打印输出 - 只打印传递给它的字符串并移动到下一行.当我传递interact另一个String -> String函数时:

upperCase :: String -> String
upperCase input = map toUpper input
Run Code Online (Sandbox Code Playgroud)

它运行正常并按预期打印大写的参数 - 所以第一个函数出了什么问题?

luq*_*qui 42

String -> String获取包含所有输入的字符串,并返回包含所有输出的字符串.按Enter键后看到输出的原因interact是因为interact (map toUpper)懒惰行为 - 它可以在知道所有输入之前开始输出.查找字符串的长度不是这样的 - 在生成任何输出之前必须知道整个字符串.

您需要发出EOF信号表示您已完成输入(在控制台中,这是Unix/Mac系统上的Control-D,我相信它是Windows上的Control-Z),然后它将为您提供长度.或者您可以通过以下方式找到每行的长度:

interact (unlines . map (show . length) . lines)
Run Code Online (Sandbox Code Playgroud)

这在每一行总是很懒,所以你知道你可以在每次输入后获得一个输出.

由于对行进行操作是如此常见的模式,我喜欢定义一个小帮助函数:

eachLine :: (String -> String) -> (String -> String)
eachLine f = unlines . map f . lines
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

main = interact (eachLine inputLength)
Run Code Online (Sandbox Code Playgroud)