|
|
이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
강동옥
가입: 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 모듈과 함께 사용하기 유용합니다. |
|
위로 |
|
|
|
|
새로운 주제를 올릴 수 없습니다 답글을 올릴 수 없습니다 주제를 수정할 수 없습니다 올린 글을 삭제할 수 없습니다 투표를 할 수 없습니다
|
Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group Translated by kss & drssay
|