2011-10-23 42 views
2

我有一個程序,它接受一個文本文件,例如值:哈斯克爾文件中讀取並添加數字

20 30 
23 5 
200 3 

我將其轉換爲一個列表,並添加每個行創建一個分類彙總,然後求和。

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 

我將如何改變這種代碼,以不同數量的前一個文本文件:

10 9 29 40 
1 34 2 
1 2 55 89 

創建各行的分類彙總列表,然後總。

+1

你'名單= []'和'列表2 = []'語句是不必要的。這些不是可變變量(就像其他語言一樣),所以你不會完成像初始化那樣的任何事情,就像你想象的那樣。 –

回答

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

readInt在我的股票未定義GHC 7.10.2。 我用我自己的函數替換它 「readInt :: [String] - > [Int]; readInt = map read」 – alxp