hLookAhead
を使用し、isEOFError
をキャッチすると、このような関数を書くことができます。しかし、IOをあなたの解析と混在させます。
よりHaskellishソリューションを定義することです。その後、
parseInts :: String -> [Int]
parseInts str = map read (words str)
と、このようなparseInts
使用:
3 4
1 1 1 1
2 2 2 2
3 3 3 3
(例:のようなファイルを解析するには
-- read an entire file and convert to a list of Ints
nums <- fmap parseInts getContents
-- read just a line and convert to a list of Ints
nums <- fmap parseInts getLine
を3 =行数、4 =列数)、オプションの束:
import Control.Monad (replicateM)
main = do
(nrows : ncols : _) <- fmap parseInts getLine
rows <- replicateM nrows $ fmap parseInts getLine
または
import Data.List.Split (chunksOf)
main = do
(nrows : ncols : rest) <- fmap parseInts getContents
let rows = chunksOf ncols rest
かさえ:
main = do
(nrows : ncols : _) <- fmap parseInts getLine
forM_ [1..nrows] $ \i -> do
row <- fmap parseInts getLine
... do something with row...
'Int'sの間に区切り文字を使用しても問題ありませんか?もしそうなら、あなたはセパレータを見るまで 'getChar'を呼び出すループを調理し、結果の' String'に対して 'readIO'を呼び出すのは簡単です。 –
「getLine」実装(?)で ''やそれに類するものの '\ n'を変更するのはどうでしょうか?http://hackage.haskell.org/package/base-4.9.0.0/docs/src/GHC .IO.Handle.Text.html#hGetLine –
これは本質的に私が記述したものですが、まず、標準的な 'getLine'実装のバッファリング認識の虚栄をすべてスキップすることをお勧めします。 –