最近、私はWaterloo CCCをやりました。私はHaskellがこれらのタイプの質問に答えるのに最適な言語だと感じます。私はまだそれを学んでいます。私は入力と少し苦労しています。ここで Haskell:行単位でファイルを読む
は、私が使用しているものです:あなたが見ることができるように、このプログラムはj1.hs
と呼ばれるにコンパイルされている場合、私は、コマンドライン指定したファイルパスから、あるいは例えば
j1.in
から読んでいる
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
。
私はファイルの最初の2行だけに興味があるので、パターンマッチングを使用してこれらの行を取得し、k
とcode
にバインドしました。そして私は整数としてk
を読んで、私が出力する私のdecode
関数にコード文字列を渡します。
readFile
がファイル全体をメモリにロードしているかどうかは不思議ですが、それは問題になります。しかし、私は考え始めました。おそらくハスケルは怠惰なので、最初の2行を読むのはそれだけです。後でそれが求められるからです。私は正しい?
また、そのコードサンプルで、よりよくまたはもっと慣用的なものがあれば教えてください。
チュートリアル 'hSetBuffering stdin LineBuffering'では、入力が一度に1行だけ入力されるため、stdinに使用されていました。ファイル入力に相当するものはありますか?それを使用することが理にかなっているのであれば、それは早すぎる最適化と見なされますか? – mk12
本質的に怠惰なI/Oは、それが簡単な場合にのみ有用であるというあなたの意見に同意しません。 I/Oが重い設定の遅延I/Oの非常に便利な機能の例は、デフォルトではデータ処理がインプレースされているため、大量のデータに対して非常に効率的です。 – amindfv
@amindfv:彼は大きなプログラムのために怠惰なI/Oが無駄だとは言わないが、それは_bad_だと言う。彼が意味することは、遅延IOは、大きくて複雑なプログラムで修正するのが難しいリソースリーク(ここではファイルが最後まで読み込まれないため、決して閉じられない)につながることが多いということです。ストリーミングのより基本的な解決策(イテレータテや最近のコンジットなど)は、より優れた制御を提供するため、望ましいものになります。 – Jedai