이승중
가입: 2010년 6월 22일 올린 글: 561
|
올려짐: 2010년11월1일 16:33 주제: OCaml 정리 |
|
|
수업시간에 질문하시는 분들이 계셔서 한번 다시 정리해보았습니다.
0. Scheme에 비해 무엇이 좋은가
각 구문에 type 이 있어서 식이 타입에 맞는 결과를 되돌려 주는지 검사합니다.
scheme에서 에러가 나지 않아서 고생했었던
없는 함수 참조, 타입이 맞지 않는 함수 만들기 등의 실수를 방지할 수 있습니다.
1. let
스킴에서의 define과 비슷합니다.
쓰고자 하는 값에 이름을 붙여줍니다.
코드: | let a = 1
let b = 1
(a + b)
|
함수를 만들때도 씁니다.
함수 정의 안에서도 let을 써서 이름을 붙일 수 있습니다.
가장 바깥의 let이 아니면 let 뒤에 꼭 in을 붙여야 합니다.
코드: | let myAdd a b =
let a1 = a - 1 in
let b1= b + 1 in
(a1 + b1) |
2. let rec
let 은 함수 정의 안쪽에서 선언하는 함수의 이름을 드러내지 않습니다.
때문에 재귀함수를 만들기가 불가능합니다. let rec은 함수 정의 안쪽에서도 지금 정의하고 있는 이름을 드러내기 때문에 함수 호출이 가능합니다.
;오늘 만들어본 fact 함수 참조..
let rec fact a 대신 let fact a 를 쓰면 에러가 나는 걸 볼 수 있습니다.
3. pair 타입
pair를 만드려면 (1, "aa") 와 같이 두개의 값을 괄호와 콤마로 묶으면 됩니다.
이 경우 pair의 타입은 int * string 이 됩니다.
(주의! ocaml의 기본 list는 pair로 만들지 않습니다)
4. 함수의 타입
코드: | let myFun a b = a + b |
스킴에서 썼던 방식과 같은 함수 선언 방식입니다.
함수의 타입은 int -> int -> int 입니다.
이 뜻은 두개의 int 타입의 값을 받으면 int값을 돌려주는 함수라는 것입니다.
주의하셔야 할 것은 pair로 인자를 받는 함수는 다른 타입입니다.
코드: | let myFun2 (a, b) = a + b |
이 함수의 타입은 (int * int) -> int 입니다.
이 경우 int, int 순서쌍 타입의 인자를 하나 받아서 int를 돌려주는 함수로 볼 수 있습니다.
첫번째 방식의 경우 마지막 인자 하나가 빠진 (myFun 3) 를 값으로 볼 수 있고 int -> int 함수 타입을 가진다고 말할 수 있습니다. 두번째 방식은 그렇게 만들 수 없습니다.
5. 사용자 지정 타입
smatch의 예를 들면,
스킴에서는 표현식 타입을 만드는 함수 atom, dot, bar, star 등을 일일히 만들어야 했고, 각각 is-atom? is-dot? is-bar? is-star?를 또 만들어서 표현식 중에서도 무슨 종류인지를 확인해야 했습니다.
OCaml에서의 사용자 지정타입은 이런 구분을 보다 손쉽게 해줍니다.
코드: | type exp =
| Atom of int
| Dot of exp * exp
| Bar of exp * exp
| Star of exp
|
위에서 타입 exp와 exp타입을 만드는 4가지 방법을 정의했습니다.
exp타입을 만드려면 위의 4가지 방법 중에 하나를 쓰면 됩니다.
코드: | let a = (Atom 3)
let b = (Atom 4)
let c = (Dot (b,a))
...
|
위에서 Dot은 exp, exp의 pair타입을 받으므로 b 와 a를 pair로 묶어 줘야 합니다.
이제 이렇게 만들어진 exp타입을 사용해 봅시다.
match ... with는 스킴에서 우리가 그동안 사용했던 cond ((is-atom?)... ) 과 같은 역할을 합니다.
값의 패턴을 비교해서 어떤 방식으로 만들어졌는 지에 따라
적절한 일을 수행합니다.
코드: | let func e1 =
match e1 with
| Atom i -> ...
| Dot (e1, e2) -> ...
| _ -> |
Atom형식에서 값을 얻고자 할때는
de-atom함수가 필요없이 바로 i를 쓰면됩니다.
좀더 알아보시고 싶으신 분은 ocaml-tutorial를 참조하시면 되겠습니다.
p.s IDE가 없어서 불편하시면 여러가지가 있는데
> vi
> emacs
> Editplus (OCaml syntax를 지원합니다. 컴파일은 직접 하셔야 합니다.)
> Eclipse (OcaIDE라고 있습니다.)
> Visual Studio 2010 (F#이 포함되어있습니다. ocaml syntax로 세팅을 바꾸면 사용가능합니다..만 나중에 제출시에는 OCaml로 다시 확인하셔야합니다)
> DrScheme + OCaml (고붕님께서 말씀하신 방법, 아까 3.72에서는 뻗던데 왜그런지 모르겠네요) |
|