2012-01-14 23 views
5

Vì vậy, tôi làm việc với các tập tin, và tôi cần phải biết dòng lớn nhất trong tập tin X. Sử dụng Unix awk kết quả trong một Int mà tôi đang tìm kiếm. Nhưng trong Haskell làm thế nào tôi có thể trả về giá trị đó và lưu nó vào một biến?
tôi đã cố gắng xác định một cái gì đó với IO [Int] -> [Int]Lưu trữ trong một biến kết quả của một vỏ như Int

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

không hoạt động nguyên nhân:

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

+1 cho hình đại diện và bút danh của bạn. :-D – missingfaktor

Trả lời

7

Điều này là do hành động system trả lại trạng thái thoát của lệnh bạn chạy không thể chuyển đổi thành Int. Bạn nên sử dụng readProcess để có được kết quả đầu ra của lệnh.

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

Lưu ý rằng readProcess không chuyển lệnh vào hệ vỏ: nó chạy trực tiếp. Tham số thứ hai là nơi các đối số của lệnh sẽ đi. Vì vậy, ví dụ của bạn phải là

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 {in x}'/home/basic/Desktop/li11112mp/textv "[] []' kết quả '(exit 127): failed' – MrFabio

+0

Bạn có chạy lệnh trực tiếp từ trình bao và xem điều gì xảy ra không? –

+0

Đó là từ vỏ – MrFabio

6

Bạn có thể sử dụng readProcess để có được đầu ra của chương trình khác. Bạn sẽ không thể chuyển đổi kết quả IO String thành số String thuần túy; tuy nhiên, bạn có thể nâng các chức năng mong đợi String vào các hàm mong đợi IO String s. Hai tài liệu tham khảo yêu thích của tôi cho mucking về với IO (và các monads khác) là bài viết blog tuyệt vời của sigfpe, You Could Have Invented Monads! (And Maybe You Already Have.)The IO Monad for People who Simply Don't Care.

Đối với vấn đề cụ thể này, tôi thực sự khuyên bạn nên tìm kiếm giải pháp Haskell thuần túy (nghĩa là, không gọi ra để làm lúng túng). Bạn có thể thích readFile, linesmaximumBy.

Các vấn đề liên quan