Wednesday, October 07, 2009

File IO를 보면서...

다음의 샘플 코드가 도움이 많이 되었음.

File Reading in Haskell

module Main
where
import IO

main = do hSetBuffering stdin LineBuffering
doLoop

doLoop = do
putStrLn "Enter a command rFN WFN or q to quit: "
command <- getLine
case command of
'q':_ -> return ()
'r':filename -> do putStrLn ("Reading " ++ filename)
doRead filename
doLoop
'w':filename -> do putStrLn ("Writing " ++ filename)
doWrite filename
doLoop
_ -> doLoop
doRead filename =
bracket (openFile filename ReadMode) hClose
(\h -> do contents <- hGetContents h
putStrLn "The first 100 chars: "
putStrLn (take 100 contents))
doWrite filename = do
putStrLn "Enter text to go into the file: "
contents <- getLine
bracket (openFile filename WriteMode) hClose
(\h -> hPutStrLn h contents)

IO어쩌고에 대한 이해부족이 문제였던 것 같다.

IO는 정확히는 function이 아닌 IO action으로서 이 action의 결과로 어떤 결과물이 나온다.
이를 직접 취하거나 직접 변경하는 것은 Haskell에서 허용되지 않으며,
<- 를 사용함으로서 Haskell에서 다룰 수 있는 '형'으로 변환시킬 수 있는 것 같다.

예를 들어 IO String은 IO String -> Var 로 해주면, Var에는 우리가 다룰 수 있는 string이 속박된다(Haskell에서는 대입의 개념이 아닌 속박의 개념이라네요... --; 이 표현도 정확히는 해당 String에 해당 Var가 속박되는 것이라고 하네요. Point free style과 비슷한 맥락인듯...)
>>>>> 부연하면, IO String은 string과 비슷하거나 같은 것인 것 같지만, IO String은 action이며 String은 '형'이다.

마찬가지로 function name도 실체는 action이므로 이를 위와 같이 해 주어야 적절하게 변수'가' 속박되더군요.

...계속? 공부중.


No comments: