게시판 인덱스

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

Set, Map 모듈, option 타입, 모듈 부가설명, ref, for루프

 
글 쓰기   답변 달기     게시판 인덱스 -> 4190.210 Principles of Programming (Fall 2012)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
강동옥



가입: 2009년 9월 18일
올린 글: 602

올리기올려짐: 2012년12월14일 15:09    주제: Set, Map 모듈, option 타입, 모듈 부가설명, ref, for루프 인용과 함께 답변

실습시간에 충분히 소개하지 못한 OCaml의 유용한 기능들을 소개하겠습니다.



과제할때 리스트 말고도 Set, Map을 사용하면 유용합니다.
그런데 Set,이나 Map은 모듈이 아니라 모듈 함수로 되어있습니다.
http://caml.inria.fr/pub/docs/manual-ocaml-4.00/libref/Map.OrderedType.html
OrderedType 시그니처에 맞는 모듈을 만들어서 넣어줘야 사용할 수 있습니다.

예를들어 int 키를 가지는 Map을 만들고 싶다면
코드:

module Key =
struct
  type t = int
  let compare = compare (* Pervasive의 compare는 함수만 아니면 대부분 비교가능 *)
end
module MyMap = Map.Make(Key)

와같이 만들어 사용할수 있습니다. 이제 MyMap은
http://caml.inria.fr/pub/docs/manual-ocaml-4.00/libref/Map.Make.html
에 정의된 함수들을 쓸 수 있습니다.

Set도 이와 유사하게 사용할 수 있습니다.

----------------------
option 타입은 "어떤 타입이거나 아무것도 없다"를 표현하고 싶을때 씁니다.
type 'a option = None | Some of 'a
형식이며 OCaml에 기본으로 제공해줍니다.

정수이거나 아무것도 없거나를 표현하고싶다면
Some 3, Some 6, None등의 값을 사용하면 OCaml에서 int option타입으로 유추해줍니다.

-----------------------
스탠다드 라이브러리의 모듈을 확장해서 사용할 수 있습니다.
코드:

module MyModule =
struct
  include List
  let my_func x = ...
end

이와같이 include하면 MyModule은 List모듈의 모든 함수를 포함하면서 추가로 my_func를 가진 모듈이 됩니다.
코드:
MyModule.hd [3;4]  (* 3 *)


모듈은 open을 사용하면 모듈명 없이 함수만 쓸 수 있습니다.
코드:
open List
hd [3;4] (* 3 *)


하나의 파일은 파일명으로 정의된 모듈입니다.
let test_func = ...를
test.ml에 작성했다면 다른 파일에서
Test.test_func 로 이용가능합니다.
------------------------
primitive 타입에 대해서는 ref를 쉽게 쓸 수 있습니다.
코드:

let a = ref 0
...
   a:=!a +1
...


하지만 Map과같은 general 타입에 대해는 ref가 잘 안될 수 있습니다.
그경우 타입을 명시해주면 잘 됩니다.
코드:

let a : (float MyMap.t) ref = ref MyMap.empty (*MyMap이 float를 value로 가짐을 명시해줌.*)
...

*ref타입을 사용할때는 항상 initialize하는 습관을 들이세요. applicative 스타일에 적응해서 side effect를 고려하지 않고 실수하기 쉽습니다.

----------------------
Matrix관련 연산을 할때 for루프가 유용할 수 있습니다.
튜토리얼때 cheat sheet에도 나와있습니다.

코드:

for var = min_value to max_value do ... done
for var = max_value downto min_value do ... done


예를들어 1부터 10까지 더한 값을 리턴하는 함수를 짜보면
코드:

let sum ()=
  let amount = ref 0 in
  for i = 1 to 10 do
    amount := !amount + i
  done
  ;
  !amount


Array 모듈과 함께 사용하기 유용합니다.
위로
사용자 정보 보기 비밀 메시지 보내기
이전 글 표시:   
글 쓰기   답변 달기     게시판 인덱스 -> 4190.210 Principles of Programming (Fall 2012) 시간대: GMT + 9 시간(한국)
페이지 11

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


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