3

Haskell でそのような入力ファイルを対応する型にキャストする高速な方法はありますか? たとえば、文字列を受け取り、Ints のリストを生成する関数は? または、文字列を使用して手動で解析する必要がありgetLineますか?

10.
10.
[4, 3, 2, 1].
[(5,8,'~'), (6,4,'*'), (7,10,'~'), (8,2,'o')].
[4,0,9,4,7,5,7,4,6,4].
[4,10,0,6,6,5,6,5,6,2].
4

2 に答える 2

7

はい、read機能です。

readFileたとえば、ファイルを読み込んだら、各行で必要なreadタイプに変換できます。ただし、最初に生理を取り除く必要があります。たとえば、次のようになります。

main = do
    text <- readFile "test.txt"
    let cases = lines text
        -- to get rid of the periods at the end of each line
        strs = map init cases
        lastLine = read $ last strs
    print $ show (map (+5) lastLine)

これはサンプル ファイルを取得Intし、最後の行から s のリストを読み取り、リスト全体に 5 を追加して出力します。

すべての行が同じタイプである場合、すべての行を取得するだけmap readですべての行を取得できます。あなたの例のように、さまざまなタイプがある場合は、各行にあるタイプを把握するためにいくつかのロジックを入れてから、そのタイプを処理するために適切な関数を呼び出す必要があります。

于 2013-06-30T05:30:33.433 に答える
5

Jeff Burka の回答に基づいて構築するために、特定のファイルに使用する特定のコードを次に示します。

main = do
    [l1, l2, l3, l4, l5, l6] <- fmap (map init . lines) $ readFile "myFile.txt"
    let myVal :: (Int, Int, [Int], [(Int, Int, Char)], [Int], [Int])
        myVal = (read l1, read l2, read l3, read l4, read l5, read l6)
    print myVal

これにより、解析されたタプルが出力されます。

部分は、init各行の終わりにある末尾のピリオドを取り除くことです。

于 2013-06-30T05:53:01.420 に答える