2012-01-14 46 views
5

因此,我使用文件,并且需要知道文件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' 
+1

+1为你的化身和化名。 :-D – missingfaktor 2012-01-14 10:38:48

回答

7

这是因为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"] "" 
+0

'* Prog> readProcess“awk”{if(length> x){x = length}} END {print x}'/ home/basic/Desktop/li11112mp/textv“[] []' results '(exit 127):failed' – MrFabio 2012-01-14 05:55:07

+0

你是否直接从shell运行命令并查看会发生什么? – 2012-01-14 05:58:44

+0

它来自shell – MrFabio 2012-01-14 06:12:33

6

您可以使用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,linesmaximumBy