티스토리 뷰

Haskell

Programming in Haskell (2)

newpolaris 2011. 1. 14. 11:46
note: 실습하면서 글 작성중인 뉴비입니다. 내용상 잘못된 점이 있을 수 있으니 양해 부탁드립니다.

이제 먼가 제대로 되는지 확인해보자

적당한 위치에 폴더를 만들고 메모장 등의 에디터(ex: vim)으로 아래 내용을 작성한 후
"qsort.hs" 파일로 저장하였다.

"qsort.hs"
qsort[] = []
qsort(x:xs) = qsort smaller ++ [x] ++ qsort larger
              where
                smaller = [a|a <- xs, a <= x]
                larger = [b|b <- xs, b > x]
winGHC의 경우 확장자를 알아서 연결 시켜 주기 때문에 위의 파일을 더블 클릭하면,


올레~


우와 동작한다;

이런 실행방법 말고도 커맨드로 load 할 것을 지시 할 수 있던데

적절한 :cd 명령어와 Tab 키 자동완성으로 해당 폴더로 이동한다.
(winHug, winGHCi 모두 Tab키는 안먹힌다 ....)
(그냥 GHC는 command window (cmd) 에서 ghci 하면 실행된다)
Prelude> :cd c:/Users/newpolaris/Projects/Haskell
Prelude> :load qsort
[1 of 1] Compiling Main             ( qsort.hs, interpreted )
Ok, modules loaded: Main.
( '\\' 역시 디렉토리 구분하는데 사용할 수 있다 cd c:\\Users\\newpolaris\\Projects\\Haskell )

이렇게 인터프리터형태로 실행시키는것 말고 ghc로 컴파일 할 수 도 있다고 한다.
qsort[] = []
qsort(x:xs) = qsort smaller ++ [x] ++ qsort larger
              where
                smaller = [a|a <- xs, a <= x]
                larger = [b|b <- xs, b > x]
짤막하게 이 함수의 수행과정을 설명하면,
이와 같은 입력이 들어왔을 때

qsort(x:xs) 이 부분은 [5,4,2,1,6] 이와 같이 숫자로 이루어진 리스트를
맨 앞의 하나(head)와 나머지 부분으로 나누는데
5와 [4,2,1,6] 으로 나누어지게 된다.
만약 원소가 하나밖에 없을 경우

나머지 부분은 빈 리스트인 []가 된다.

'++' 기호는 리스트를 연결하는 연산자이다. [5] ++ [3] = [5,3] 이 된다.
where는 local definition을 위한 예약어로

위에서는 맨 앞의 원소(head)인 x 보다 작거나 같은 원소로 이루어진 smaller 라는 리스트와 
x 보다 큰 원소로 이루어진 larger라는 리스트를 정의하는데

헤더를 제외한 나머지 부분인 xs의 모든 원소중 x 보다 작거나 같은 원소의 집합으로 이루어진 리스트 정도로 해석하면 될 것 같다.
  qsort[5,4,2,1,6]                   -- x(head): 5, xs: 4,2,1,6 
= qsort[4,2,1] ++ [5] ++ qsort[6]        -- x(head): 4, xs:2,1
= qsort[2,1] ++ [4] ++ qsort[] ++ [5] ++ qsort[6] 
= qsort[1] ++ [2] ++ [4] ++ [] ++ [5] ++ qsort[] ++ [6] ++ qsort[]
= ...
= [1,2,4,5,6]

note: -- 는 주석기호이다. 블록주석은 {-,  -} 로 이루어진다.

마지막으로 이 함수는 리스트 연결하는 ++ 연산자와 대소비교로 이루어져있으므로
단지 수 뿐만이 아니라 순서를 매길 수 있는 값이면 어떤 타입도 가능하고한다. 뭐 뒤에가면 알게되져;
*Main> qsort['3','9','e','a','b']
"39abe"
대충 먼가 동작은 하는 것 같은데 대체 먼지;
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크