2012-10-30 45 views
1

我有一個文本文件,其中每行包含兩個列表。每個列表可以包含任意數量的字母數字參數。 例如[t1,t2,...] [m1,m2,...] 我可以將文件讀入ghc,但是如何將它讀入另一個主文件以及主文件如何分別識別每個參數然後處理它?如何將文本文件讀入haskell程序?

+6

你有什麼試過?您是否查看過任何Haskell教程或文檔的相關部分? –

+0

[This](http://www.learnyouahaskell.com/)是一本幫助你學習Haskell的好書。它在I/O方面有很好的一章。 –

回答

2

我認爲最好讓你自己弄清楚大部分情況,但我已經爲你提供了一些指導。 首先,儘量不要處理文件訪問,直到你有其他的代碼工作,否則你可能會在所有地方都有IO。從一些樣本數據:

sampleData = "[m1,m2,m3][x1,x2,x3,x4]\n[f3,f4,f5][y7,y8,y123]\n[m4,m5,m6][x5,x6,x7,x8]" 

在你的代碼不應該提sampleData其他地方,但你應該在ghci中使用它進行測試。

一旦你有,你想要做的一切,例如processLists::String->[(String,String)]功能,你可以用

readInLists :: FilePath -> IO [(String,String)] 
readInLists filename = fmap processLists (readFile filename) 

replcae readFile "data.txt" :: IO String如果fmap是沒有意義的,你可以閱讀tutorial I accidentally wrote

如果他們真的是字母數字,你可以很容易地拆分它們。這裏有一些方便的功能,附帶示例。

tail :: [a] -> [a] 
tail "(This)" = "This)" 

你可以用它在你的字符串前面扔掉你不想要的東西。

break :: (Char->Bool) -> String -> (String,String) 
break (== ' ') "Hello Mum" = ("Hello"," Mum") 

所以break使用測試,以找出第二個字符串的第一個字符,而之前它打破了字符串。 請注意,中斷字符仍然存在於下一個字符串的前面。 span是相同的,但使用什麼有在第一列表中的測試,所以

span :: (Char->Bool) -> String -> (String,String) 
span (/= ' ') "Hello Mum" = ("Hello"," Mum") 

您可以使用這些東西的功能,如(==','),或isAlphaNum(你必須import Data.Char在你的文件的頂部使用它)。

你可能想看看我在this answer中的功能splitWithsplitOn。它們基於Prelude的splitwords的定義。

+2

你「不小心」寫了一篇教程?這是如何發生的? = p –

+2

@代碼大師我寫了一個答案,它變得非常失控。它比我典型的答案更長,現在甚至有一個附錄。它只是一個簡短的例子,但最終成爲了一個教程。好吧。 – AndrewC

+3

答案和教程密鑰就像是緊挨着一樣。 –