我們必須像一個標準輸入:解析輸入和做動作
1 2 3
4 5 6
1 3 2
5 3 2
...
每一行包括恰好三個數字,每行,我們想計算的函數值
f :: (Int, Int, Int) -> Int
和打印結果。怎麼做?
我們必須像一個標準輸入:解析輸入和做動作
1 2 3
4 5 6
1 3 2
5 3 2
...
每一行包括恰好三個數字,每行,我們想計算的函數值
f :: (Int, Int, Int) -> Int
和打印結果。怎麼做?
我會指出一些有用的功能,這將幫助你在你的追求:
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">
我會補充的另一個建議是,列表理解語法對於使這種任務可讀是非常有用的。使用模式匹配特別方便:'[... | [a,b,c] < - 地圖字(行str)]'。哦,你需要'讀'功能。 –
一個簡單的解決方案:
tuple3 :: [Int] -> (Int,Int,Int)
tuple3 [x,y,z] = (x,y,z)
main = mapM_ print . map (f . tuple3 . map read . words) . lines =<< getContents
我還是不明白爲什麼要使用一個元組作爲參數,它會導致難看的轉換。
如果'f'是'f :: Int-> Int-> Int-> Int'?它將如何改變主體? – Cartesius00
@Martin無論如何它不會很整潔,但是從一個列表轉換爲一個元組很醜陋:它不能保證列表需要大量元素,結果元組將是多餘的(結尾有三個相同的類型) ,所以它充滿了運行時異常。從美學的角度來看,就像比較蘋果和橘子。 元組和列表是Haskell中類型性質完全不同的對象(與Python不同):元組是固定大小的任何類型的項目集合(我懷疑它只存在於編譯時),列表是運行時相同類型的項目序列。 –
這看起來像一個家庭作業問題,這是一種真棒。你試過什麼了?你認爲什麼是解決方案的一部分? –
@JameySharp不,不,即使它看起來像這樣,我正在學習Haskell :-) – Cartesius00
夠公平的! :-) –