2012-10-30 12 views
1

각 줄마다 두 개의 목록을 포함하는 텍스트 파일이 있습니다. 각 목록에는 임의의 수의 영숫자 인수가 포함될 수 있습니다. 예 : [t1, t2, ...] [m1, m2, ...] 파일을 ghc로 읽을 수는 있지만 어떻게 다른 기본 파일로이 파일을 읽을 수 있으며 어떻게 주 파일이 각 인수를 개별적으로 인식 할 수 있습니까? 그런 다음 처리할까요?텍스트 파일을 haskell 프로그램으로 읽는 방법은 무엇입니까?

+6

무엇을 시도 했습니까? 하스켈 튜토리얼이나 문서의 관련 섹션을 보셨습니까? –

+0

[This] (http://www.learnyouahaskell.com/)는 하스켈을 배우는 데 도움이되는 훌륭한 책입니다. 그것은 I/O에 대한 훌륭한 장을 가지고 있습니다. –

답변

2

나는이 문제의 대부분을 스스로 해결하는 것이 가장 좋다고 생각하지만, 몇 가지 조언이 있습니다. 먼저 코드의 나머지 부분을 사용할 때까지 파일 액세스를 다루지 마십시오. 그렇지 않으면 온통 IO가 발생할 수 있습니다. 당신은 당신의 코드에서 다른 곳 sampleData을 언급해서는 안

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

,하지만 당신은 테스트를 위해 ghci에서 사용한다 : 일부 샘플 데이터로 시작합니다. fmap 당신에게 어떤 의미가없는 경우

당신은 당신이 원하는 모든 것을, 예를 들면 processLists::String->[(String,String)]을하는 기능이 있으면, 당신은 당신이 tutorial I accidentally wrote를 읽을 수,

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

readFile "data.txt" :: IO String을 replcae 수 있습니다.

실제로 영숫자 인 경우 아주 쉽게 나눌 수 있습니다. 다음은 몇 가지 편리한 기능과 예제입니다.

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

@ Code-Guru 나는 ​​답을 썼다. 그것은 나의 전형적인 대답보다는 오히려 더 오랫동안 끝났고, 지금 심지어 부록을 가지고있다. 그것은 몇 가지 빠른 예제로 시작되었지만 더 많은 튜토리얼로 마무리되었습니다. 오 잘. – AndrewC

+3

답변과 자습서 키는 바로 옆에 있습니다. –

관련 문제