Сохраните в переменной результат оболочки как Int - PullRequest
5 голосов
/ 14 января 2012

Итак, я работаю с файлами, и мне нужно знать самую большую строку в файле X. Использование Unix awk приводит к искомому Int.Но в Haskell, как я могу вернуть это значение и сохранить его в переменной?
Я пытался определить что-то с помощью IO [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'

Ответы [ 2 ]

7 голосов
/ 14 января 2012

Это связано с тем, что действие system возвращает состояние завершения выполняемой вами команды, которое не может быть преобразовано в Int.Вы должны использовать readProcess для получения вывода команд.

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

Обратите внимание, что readProcess не передает команду в системную оболочку: она запускает ее напрямую.Второй параметр - то, куда должны идти аргументы команды.Итак, ваш пример должен быть

readProcess "awk" [" { if ( length > x ) { x = length } }END{ print x }", "/home/basic/Desktop/li11112mp/textv"] ""
6 голосов
/ 14 января 2012

Вы можете использовать readProcess, чтобы получить вывод другой программы. Вы не сможете конвертировать полученный IO String в чистый String; однако можно поднять функции, ожидающие String с, в функции, ожидающие IO String с. Мои две любимые ссылки для хулиганства с IO (и различными другими монадами) - это отличные посты sigfpe в блоге, Вы могли бы изобрести монады! (И, может быть, у вас уже есть.) и Монада IO для людей, которым просто все равно .

Для этой конкретной проблемы я настоятельно рекомендую поискать решение на чистом Хаскеле (то есть не вызывать awk). Вам могут понравиться readFile, lines и maximumBy.

...