将变量作为Int存储在shell中

MrF*_*bio 5 unix haskell ghc

所以我使用文件,我需要知道文件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)

Abh*_*kar 7

这是因为该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)


Dan*_*ner 6

您可以使用它readProcess来获取另一个程序的输出.你将无法将结果IO String转换成纯粹的String; 但是,您可以将期望Strings的函数提升为期望s的函数IO String.我最喜欢使用IO(以及其他各种monad)的两个参考文献是sigfpe的优秀博客文章,你可以发明Monad!(也许你已经拥有了.)那些根本不关心的人的IO Monad.

对于这个特殊的问题,我强烈建议寻找一个纯Haskell解决方案(也就是说,不要调用awk).你可能会喜欢 readFile,linesmaximumBy.