2011-10-23 7 views
2

私は、例えば値を持つテキストファイルを取るプログラムを持っている:Haskellのファイルの読み取りと番号の追加

20 30 
23 5 
200 3 

そして、私はそれをリストに変換し、小計を作成するために、各ライン、次に合計を追加。

10 9 29 40 
1 34 2 
1 2 55 89 

各行の小計のリストと、その後合計を作成します。私は、異なる数の元のテキストファイルに取るために、このコードを変更する方法を

import System.IO 
import Control.Monad 

f :: [String] -> [Int] 
f = map read 

subsum :: [Int] -> [Int] 
subsum [] = [] 
subsum [x] = [] 
subsum (x:(y:xs)) = (x+y) : (subsum xs) 

calc fromf = do 
     let list = [] 
     let list2 = [] 
     handle <- openFile fromf ReadMode 
     contents <- hGetContents handle 
     let singlewords = words contents 
      list = f singlewords 
      list2 = subsum list 
      result = sum list2 
     print list2 
     print result 
     hClose handle 

+1

あなた 'リスト= []'と 'LIST2 = []'ステートメントは不要です。これらは可変変数ではありません(他の言語の場合と同じように)、あなたは想像しているように、初期化のような何も達成していません。 –

答えて

2

はいかが

import System.IO 
import Control.Monad 

subtotals :: String -> [Int] 
subtotals c = map sum (map (map readInt) (map words (lines c))) 
    where 
     readInt = read :: String -> Int 

calc fname = do 
    contents <- readFile fname 
    print $ subtotals contents 
    print $ sum (subtotals contents) 
+0

独創的です:)ありがとうございます – DustBunny

+0

私の株GHC 7.10.2でreadIntは未定義です。 私自身の関数に置き換えました "readInt :: [String] - > [Int]; readInt = map read" – alxp

関連する問題