将外壳的结果存储为Int
问题描述:
因此,我使用文件,并且需要知道文件X中的最大行。使用Unix awk会导致我正在查找的Int。但是在Haskell中,我如何返回该值并将其保存到变量中?
我试着定义一些与IO [Int] -> [Int]
将外壳的结果存储为Int
maxline = do{system "awk ' { if (length > x) { x = length } }END{ print x }' filename";}
不工作的原因:
Couldn't match expected type 'Int',against inferred type 'IO GHC.IO.Exception.ExitCode'
答
这是因为system
操作返回了您运行的命令的退出状态,该命令无法转换为Int
。您应该使用readProcess
来获取命令输出。
> readProcess "date" [] []
"Thu Feb 7 10:03:39 PST 2008\n"
注意readProcess
未通过命令系统shell:它直接运行它。第二个参数是命令参数应该去的地方。所以你的例子应该是
readProcess "awk" [" { if (length > x) { x = length } }END{ print x }", "/home/basic/Desktop/li11112mp/textv"] ""
答
您可以使用readProcess
得到另一个程序的输出。您将无法将生成的IO String
转换为纯粹的String
;但是,您可以将期望String
s的函数提升为预期为IO String
s的函数。我最喜欢的两个关于IO(以及其他各种monad)的参考文献是sigfpe的优秀博文,You Could Have Invented Monads! (And Maybe You Already Have.)和The IO Monad for People who Simply Don't Care。
对于这个特定的问题,我强烈建议寻找一个纯Haskell解决方案(即不要调用awk)。您可能会喜欢readFile
,lines
和maximumBy
。
+1为你的化身和化名。 :-D – missingfaktor 2012-01-14 10:38:48