2012-01-14 25 views
5

olarak depolanır. Dosyalarla çalışıyorum ve X dosyasındaki en büyük satırı bilmem gerekiyor. Unix awk'yi kullanmak, aradığım bir Int ile sonuçlanıyor. Ama Haskell'de bu değeri nasıl iade edebilirim ve bir değişkene nasıl kaydedebilirim?Değişkende bir kabuk sonucu Int

Couldn't match expected type 'Int',against inferred type 'IO GHC.IO.Exception.ExitCode' 
+1

+1 olmalıdır. :-D – missingfaktor

cevap

7

Bunun nedeni,eyleminin, çalıştırdığınız komutun çıkış durumunu döndürmesidir; bu, Int'a dönüştürülemez. Komutların çıktısını almak için readProcess'u kullanmalısınız. readProcess sistem kabuğuna komutu geçmez

> readProcess "date" [] [] 
    "Thu Feb 7 10:03:39 PST 2008\n" 

Not: doğrudan çalışır. İkinci parametre, komutun argümanlarının nereye gitmesi gerektiği. Bu nedenle, örneğiniz avatarınız ve takma adınız için

readProcess "awk" [" { if (length > x) { x = length } }END{ print x }", "/home/basic/Desktop/li11112mp/textv"] "" 
+0

'* Prog> readProcess "awk '{if (uzunluk> x) {x = uzunluk}} END {print x}'/home/temel/Masaüstü/li11112mp/textv"[] []' sonuç '(exit 127): başarısız ' – MrFabio

+0

Komutu doğrudan kabuktan çalıştırıp neler olduğunu gördünüz mü? –

+0

Kabuğundan – MrFabio

6

başka programın çıktısını almak için readProcess kullanabilirsiniz:
Sebebini çalışmıyor IO [Int] -> [Int]

maxline = do{system "awk ' { if (length > x) { x = length } }END{ print x }' filename";} 

ile bir şeyler tanımlamak çalıştı. Ortaya çıkan IO String'u String numaralı bir renge dönüştüremezsiniz; ancak, String s işlevlerini beklediğiniz işlevleri IO String s beklersiniz. IO (ve diğer çeşitli monads) ile mucking Benim iki favori referanslar mükemmel blog yayınları, You Could Have Invented Monads! (And Maybe You Already Have.) ve The IO Monad for People who Simply Don't Care SIGFPE olan onlar. Bu özel sorun için

, şiddetle (yani, awk seslenerek değildir) saf-Haskell çözüm bulma içine bakarak öneririz olacaktır. Sen readFile, lines ve maximumBy beğenebilirsiniz.