게시판 인덱스

 
 FAQFAQ   검색검색   멤버리스트멤버리스트   사용자 그룹사용자 그룹   사용자 등록하기사용자 등록하기 
 개인 정보개인 정보   비공개 메시지를 확인하려면 로그인하십시오비공개 메시지를 확인하려면 로그인하십시오   로그인로그인 

OCaml 정리

 
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.210 Principles of Programming (Fall 2010)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
이승중



가입: 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에서는 뻗던데 왜그런지 모르겠네요)
위로
사용자 정보 보기 비밀 메시지 보내기
김진영_



가입: 2009년 12월 9일
올린 글: 337

올리기올려짐: 2010년11월2일 13:20    주제: 인용과 함께 답변

Introduction to Objective Caml이라는 자료를 소개해 드립니다.

http://files.metaprl.org/doc/ocaml-book.pdf

그 외에도 많은 참고자료들을 조교 페이지에서 확인하실 수 있으니 참고하시기 바랍니다.

http://ropas.snu.ac.kr/~ta/4190.210/10
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기
이전 글 표시:   
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.210 Principles of Programming (Fall 2010) 시간대: GMT + 9 시간(한국)
페이지 11

 
건너뛰기:  
새로운 주제를 올릴 수 없습니다
답글을 올릴 수 없습니다
주제를 수정할 수 없습니다
올린 글을 삭제할 수 없습니다
투표를 할 수 없습니다


Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group
Translated by kss & drssay