所以我使用文件,我需要知道文件X中最大的行.使用Unix awk会产生我正在寻找的Int.但是在Haskell中,我如何返回该值并将其保存到变量中?
我试着定义一些东西IO [Int] -> [Int]
maxline = do{system "awk ' { if ( length > x ) { x = length } }END{ print x }' filename";}
Run Code Online (Sandbox Code Playgroud)
不起作用原因:
Couldn't match expected type 'Int',against inferred type 'IO GHC.IO.Exception.ExitCode'
Run Code Online (Sandbox Code Playgroud)
这是因为该system操作返回您运行的命令的退出状态,该命令无法转换为Int.您应该使用它readProcess来获取命令输出.
> readProcess "date" [] []
"Thu Feb 7 10:03:39 PST 2008\n"
Run Code Online (Sandbox Code Playgroud)
请注意,readProcess该命令不会将命令传递给系统shell:它直接运行它.第二个参数是命令参数的位置.所以你的榜样应该是
readProcess "awk" [" { if ( length > x ) { x = length } }END{ print x }", "/home/basic/Desktop/li11112mp/textv"] ""
Run Code Online (Sandbox Code Playgroud)
您可以使用它readProcess来获取另一个程序的输出.你将无法将结果IO String转换成纯粹的String; 但是,您可以将期望Strings的函数提升为期望s的函数IO String.我最喜欢使用IO(以及其他各种monad)的两个参考文献是sigfpe的优秀博客文章,你可以发明Monad!(也许你已经拥有了.)和那些根本不关心的人的IO Monad.
对于这个特殊的问题,我强烈建议寻找一个纯Haskell解决方案(也就是说,不要调用awk).你可能会喜欢 readFile,lines和maximumBy.
| 归档时间: |
|
| 查看次数: |
194 次 |
| 最近记录: |