티스토리 뷰
note: 실습하면서 글 작성중인 뉴비입니다. 내용상 잘못된 점이 있을 수 있으니 양해 부탁드립니다.
이제 먼가 제대로 되는지 확인해보자
적당한 위치에 폴더를 만들고 메모장 등의 에디터(ex: vim)으로 아래 내용을 작성한 후
"qsort.hs" 파일로 저장하였다.
"qsort.hs"
올레~
우와 동작한다;
이런 실행방법 말고도 커맨드로 load 할 것을 지시 할 수 있던데
적절한 :cd 명령어와 Tab 키 자동완성으로 해당 폴더로 이동한다.
(winHug, winGHCi 모두 Tab키는 안먹힌다 ....)
(그냥 GHC는 command window (cmd) 에서 ghci 하면 실행된다)
이렇게 인터프리터형태로 실행시키는것 말고 ghc로 컴파일 할 수 도 있다고 한다.
이와 같은 입력이 들어왔을 때
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 보다 작거나 같은 원소의 집합으로 이루어진 리스트 정도로 해석하면 될 것 같다.
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"대충 먼가 동작은 하는 것 같은데 대체 먼지;
'Haskell' 카테고리의 다른 글
Programming in Haskell (6) ch3. Exercise (0) | 2011.01.17 |
---|---|
Programming in Haskell (5) ch2. Exercise (0) | 2011.01.14 |
Programming in Haskell (4) (0) | 2011.01.14 |
Programming in Haskell (3) Ch1. Exercise (0) | 2011.01.14 |
Programming in Haskell (1) 시작하기 (0) | 2011.01.11 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크