2012-11-01 18 views
3

我們必須像一個標準輸入:解析輸入和做動作

1 2 3 
4 5 6 
1 3 2 
5 3 2 
... 

每一行包括恰好三個數字,每行,我們想計算的函數值

f :: (Int, Int, Int) -> Int 

和打印結果。怎麼做?

+5

這看起來像一個家庭作業問題,這是一種真棒。你試過什麼了?你認爲什麼是解決方案的一部分? –

+0

@JameySharp不,不,即使它看起來像這樣,我正在學習Haskell :-) – Cartesius00

+0

夠公平的! :-) –

回答

3

我會指出一些有用的功能,這將幫助你在你的追求:

readFile :: FilePath -> IO String 

lines :: String -> [String] 

words :: String -> [String] 

print :: (Show a) => a -> IO() 

我建議你打開一個ghci會議,嘗試這些功能一點點,看看他們做什麼,嘗試以創造性的方式將它們混合在一起。我會給你一個開始:

Prelude> str <- readFile "test.txt" 
Prelude> print (length (lines str)) 
<The number of lines in the file "test.txt"> 
+1

我會補充的另一個建議是,列表理解語法對於使這種任務可讀是非常有用的。使用模式匹配特別方便:'[... | [a,b,c] < - 地圖字(行str)]'。哦,你需要'讀'功能。 –

2

一個簡單的解決方案:

tuple3 :: [Int] -> (Int,Int,Int) 
tuple3 [x,y,z] = (x,y,z) 

main = mapM_ print . map (f . tuple3 . map read . words) . lines =<< getContents 

我還是不明白爲什麼要使用一個元組作爲參數,它會導致難看的轉換。

+0

如果'f'是'f :: Int-> Int-> Int-> Int'?它將如何改變主體? – Cartesius00

+0

@Martin無論如何它不會很整潔,但是從一個列表轉換爲一個元組很醜陋:它不能保證列表需要大量元素,結果元組將是多餘的(結尾有三個相同的類型) ,所以它充滿了運行時異常。從美學的角度來看,就像比較蘋果和橘子。 元組和列表是Haskell中類型性質完全不同的對象(與Python不同):元組是固定大小的任何類型的項目集合(我懷疑它只存在於編譯時),列表是運行時相同類型的項目序列。 –