Я недавно сделал Waterloo CCC , и я чувствую, что Haskell - идеальный язык для ответа на такие вопросы.Я все еще учусь этому.Однако я немного борюсь с вводом.
Вот что я использую:
import IO
import System.Environment
import System.FilePath
…
main = do
name <- getProgName
args <- getArgs
input <- readFile $
if not (null args)
then head args
else dropExtension name ++ ".in"
let (k:code:_) = lines input
putStrLn $ decode (read k) code
Как вы видите, я читаю из командной строки указанный путь к файлуили из j1.in
, например, если эта программа называется j1.hs
и скомпилирована в j1
.
Меня интересуют только первые две строки файла, поэтому я использовал сопоставление с образцом, чтобы получитьэти строки и связать их с k
и code
, в этом примере.И тогда я читаю k
как целое число и передаю его и строку кода моей функции decode
, которую я вывожу.
Мне интересно, загружает ли readFile
весь файл в память,что было бы плохо.Но потом я начал думать, возможно, поскольку Haskell ленив, он читает только первые две строки, потому что это все, о чем он просил позже.Я прав?
Кроме того, если есть что-то с этим примером кода, которое может быть лучше или более идиоматическим, пожалуйста, дайте мне знать.