最終更新:2010-12-15 (水) 04:08:28 (4883d)  

OCaml
Top / OCaml

Objective Caml (Categorical Abstract Machine Language)

フランスの情報技術系の研究機関の INRIA で開発されている関数型言語 ML (の方言)

目的・効用は、

  • コードの再利用の範囲が大きい (多相型?)
  • コードの記述量が短かくなる (型推論データ構造パターンマッチング?)
  • バグの入り込む余地が少なくなる (GC、関数的(副作用の少ない)プログラミング)

http://caml.inria.fr/

対話式コンパイラ

ocaml 
;; と入力で評価実行
#quit;; でインタプリタ終了

特徴

サンプル

  • int
0b10 - 2進数 
0o10 - 8進数
10 - 10進数
0x10 - 16進数
  • float
10. 
  • 演算子は +. -. *. /.
  • char
  • string
    • 結合演算子 ^
"hello"^" world""

キャスト

  • X_of_Y という関数がある
  • int_of_float (floatをintに、小数点以下切り捨て)

コメント

 (*ここにコメント*)

変数束縛?

  • 変数に値を割り当てること
# let pi = 3.14;;
val pi : float = 3.14
# pi;;
- : float = 3.14
# let pi : float = 3.14;;(*型を指定*)

関数

  let sampleFunc arg1=arg1*arg1;;

局所的変数束縛?

let 変数 = 式1 in2;;
  • 式1を評価
  • 変数をその値に束縛
  • 式2の評価結果の値を求める

変数の同時束縛

# let x=2 and y=1;;
val x : int = 2
val y : int = 1

# let x=y and y=x;; (*同時に値を束縛*)
val x : int = 1
val y : int = 2
 

分岐

# let abs x = if x>0 then x else -x;;
val abs : int -> int = <fun>
#abs 5;;
- : int = 5
#abs(-4);;
- : int = 4

データ構造

タプル

  • 複数の値を並べたもの
# (1.0, 2.0);;
- : float * float = (1., 2.)
  • *はタプルの型構築子
  • 代入
# let hoge =(1.0,2.0,("hoge",1));;(*入れ子のタプル*)
val hoge : float * float * (string * int) = (1., 2., ("hoge", 1))
# let (val1,val2,(val3,val4))=hoge; (*要素の取り出し*)
val val1 : float = 1.
val val2 : float = 2.
val val3 : string = "hoge"
val val4 : int = 1
(*ワイルドカードパターン*)
(*一部の値が必要ない場合は_と書いておく*)
# let (_,_,(val3,_))=hoge;;(*val3だけ取り出し*)
val val3 : string = "hoge"

タプルを用いた関数

# let avg p = 
  let (x,y) = p in (*値の取り出し*)
  (x +. y)/.2.0;;(*評価*)
val avg : float * float -> float = <fun>
#  avg (2.5,3.5);;
- : float = 3.

ディレクティブ

  • #quit
  • #cd <ディレクトリ名>
  • #use <ファイル名>
  • #load <ファイル名>
  • #print_depth <整数>
  • #print_length <整数>
  • #trace <関数名>
  • #untrace <関数名>

関連

  • 多様性?
  • 型推論
  • 多相変数? (多相バリアント?)
  • LablTk?

参考