2013-06-30 59 views
3

Haskell有什麼快速的方法將類似這樣的輸入文件轉換爲相應的類型嗎?例如一個函數需要一個字符串併產生一個Int s的列表?或者我需要使用getLine來手動解析並解析字符串?解析Haskell中的輸入文件文件

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]. 

回答

5

是的,read函數。

例如,如果您使用readFile讀入文件,您可以將每行轉換爲您想要的類型。不過,您必須先排除這些時段。因此,例如:

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個列表讀取,添加5〜整個名單,並打印出來。

如果每行都是相同的類型,您可以在所有行上使用map read以獲取所有行。如果存在不同的類型,就像在你的例子中那樣,你必須加入一些邏輯來確定每一行的類型,然後調用適當的函數來處理這種類型。

+0

非常感謝你的工作||其中之一就是我最喜歡的哈斯克爾 – user2184057

4

要建立在傑夫·布爾卡的答案,這裏的特定代碼,你會用你的特定文件:

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的一部分是擺脫你在每行結尾的尾隨期。