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)
| 归档时间: |
|
| 查看次数: |
4522 次 |
| 最近记录: |