Thursday, August 25, 2011

Chapter 3. Simple Graphics

Hello World를 화면에 출력해보자.
Main.hs라는 파일에 아래의 내용을 입력한다.
-- module의 이름과 파일의 확장자를 뺀 이름이 같아야 한다.
module Main where
main = putStr "Hello World\n"

위 프로그램을 컴파일 후 실행하면 화면에 Hello World가 출력될 것이다. putStr의 type은 'String -> IO ()'이다. I/O action을 취하는 것은 IO T 로 표시한다. 여기서 T는 type을 의미한다. IO ()는 I/O를 하고 아무것도 리턴하지 않는 것을 의미한다. IO String은 I/O를 하고 String을 리턴하는 것을 의미한다.

파일에 텍스트를 쓰고 화면에 텍스트를 표시하는 것을 둘 다 하고 싶을 수 있다. 이럴 경우에는 do를 사용한다.
do writeFile "testFile.txt" "Hello File System"
putStr "Hello World\n"

testFile.txt라는 파일에 Hello File System을 쓰고 화면에 Hello World를 표시할 것이다. writeFile은 아래의 타입을 가진다.
writeFile :: FilePath -> String -> IO ()
type FilePath = String

사용자로부터 한 라인의 입력을 얻기 위해서는 getLine을 사용하면 된다.
getLine :: IO String

사용자로부터 입력을 받고 그것을 testFile.txt에 쓰는 코드는 아래와 같다.
do s <- getLine
   writeFile "testFile.txt" s

파일의 전체 내용을 읽어서 화면에 표시하는 코드는 아래와 같다.
do s <- readFile "testFile.txt"
   putStr s

그래픽 명령어를 살펴보자.

윈도우를 만드는 함수는 openWindow이다.
openWindow :: Title -> Size -> IO Window
type Title = String
type Size  = (Int, Int)

새 윈도우를 만드는 코드를 짜보자.
main = runGraphics (
-- 타이틀이 First Window이고 크기가 300x300인 위도우를 만든다.
do w <- openWindow "First Window" (300, 300)
         -- 지정한 윈도우에 그림을 그린다.
         drawInWindow w (text (100, 200) "HelloWorld")
         -- 키보드로부터 키 입력을 받아서 이를 k에 넣는다.
         k <- getKey w
         -- 지정한 윈도우를 닫는다.
         closeWindow w
       )

위에 사용된 함수들의 타입을 보자. runGraphics가 그래픽 action들을 실행한다.
runGraphics :: IO ()
drawInWindow :: Window -> Graphic -> IO ()
test :: Point -> String -> Graphic
type Point = (Int, Int)
getKey :: Window -> IO ()
closeWindow :: Window -> IO ()

위 코드는 아무 키나 입력되면 위도우를 닫는다. 이것을 ' '(space)가 입력되면 윈도우를 닫는 코드로 바꾸어 보자.
main = runGraphics (
do w <- openWindow "First Program" (300, 300)
         drawInWindow w (text (100, 200) "Hello World")
         spaceClose w
       )

spaceClose :: Window -> IO ()
spaceClose w = do k <- getKey w
                  if k == ' '
                  then closeWindow w
                  else spaceClose w

No comments:

Post a Comment