OCaml勉強会@axsh(はじめのいっぽ)Id:s1061123
OcamlとはOcaml = Objective Camlの略
公式ページにOcamlって書いてない!!!公式ページはhttp://caml.inria.fr/index.en.htmlです.
Objective Caml勉強会@axsh(はじめのいっぽ)Id:s1061123
OcamlObjective CamlとはObjective Caml= Caml言語のObject拡張版CamlとはフランスのINRIAという研究所で開発された関数型言語で↓等々を供えた言語型システム(型推論・多相型)パターンマッチングOcamlはそれに↓を追加した言語モジュールシステムオブジェクト機能Native Compiler(ネイティブバイナリ吐ける!)
Objective Camlの親戚一覧ML系列 (Objective Camlと同類)F# (for .Net) http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/default.aspxStandard ML of New Jersey (SML/nj) http://www.smlnj.org/ Alice http://www.ps.uni-saarland.de/alice/SML# http://www.pllab.riec.tohoku.ac.jp/smlsharp/ja/HaskellClosureConcurrent CleanLisp/scheme
特徴型推論があるので(ある程度)プログラムのエラーを静的に解析できるパターンマッチによって複雑な条件式が簡潔に書ける高階関数(Higher Order Function)や多相型(Polymorphic Type)によってより柔軟な処理の記述が可能
最終的なGoalOcamlのプログラムのコンパイルの仕方,実行方法が分かるようになる関数型言語の知識が(少し)分かるようになる(型推論とか,パターンマッチングとか…)関数型言語っぽいプログラミングのマナーを知る(再帰脳・リスト指向・高階関数使用)
目次データ構造体
リスト・ペア
レコード
バリアント
パターンマッチ
再帰
多相型について
多相型関数
多相型データインストール“Hello world!”プログラムの起動・終了プログラムの解説その他型について関数関数定義条件分岐再帰
インストールWindows: Cygwin/MinGW/MSのどちからを選択.違いはビルド環境ライブラリ,生成コードのインターフェイスに違い詳しくは公式ページ(http://caml.inria.fr/ocaml/portability.en.html)ちなみに僕はMinGWをよくインストールしますTcl/Tk(Active TCL)をインストールすると吉Object Browser(リファレンス)が使えますOcamlベースのF#をインストールするというのも…
インストールMac: Intel版を公式サイトからダウンロードMacPortsからインストールUnix/Linux:ソースから頑張るgccインストールよりは確実に楽ですパッケージはいろいろありますGentoo/Redhat/Debian for LinuxPorts/pkgsrc for *BSD
とりあえずhello world!Nativeバイナリ版はあとで解説しまつWindowsでUnixで
解説kagaribi% ocaml        Objective Caml version 3.10.2# print_string "hello world!";;hello world!- : unit = ()# ^Dkagaribi%プログラムの入力プロンプト出力プログラムの型”^d”で終了
プログラム解説# print_string“hello world!”;;関数名引数ターミネーター引数渡す際にかっこ”()”やコンマ”,”は不要
文字列は””で囲む
プログラムを評価したい場合には”;;”を末尾に
評価については2枚後で説明
print_stringは文字列を受けとって表示する関数プログラム解説hello world!- : unit = ()標準出力プロンプト結果の型返り値Print_stringの結果の表示の後に評価の結果を表示unitというのは型の一つでvoidみたいなもの 型についてはあとで説明“()”はunit型の値他の例# 10 + 20;;- : int = 30#
“評価”とは?与えられたOcaml式をコンピュータが解析すること関数に全ての引数が与えられたら実行kagaribi% ocaml        Objective Caml version 3.10.2# print_string “test string”;;←関数に引数を加えて評価test string- : unit = ()←実行される# 10;;←数字を評価: int = 10←評価の結果は変わらず# print_string;;←関数を評価すると?- : string -> unit = <fun>←関数が返ってくる#
Type, Type, Type!!! (1)型推論する関数型言語にとって型は命ですint	:31bit整数型 (Int32, Int64という型もあります)float	: 不動小数点型 (doubleっぽい)string	: 文字列型  (“test” で表記)char 	: 文字型(‘a’ で表記)bool	: true/falseunit	: 値を返さない型.値は()のみT1 ->T2: 型T1の値を引数でT2の型の値を返す関数の型
Type, Type, Type!!! (2): 例kagaribi% ocaml        Objective Caml version 3.10.2# 10;;- : int = 10# 10.1;;- : float = 10.1# "test";;- : string = "test"# 'a';;- : char = 'a'# true;;- : bool = true# false;;- : bool = false# ();;- : unit = ()# print_string;;- : string -> unit = <fun>
目次データ構造体
リスト・ペア
レコード
バリアント
パターンマッチ
再帰
多相型について
多相型関数
多相型データインストール“Hello world!”プログラムの起動・終了プログラムの解説その他型について関数関数定義条件分岐再帰
関数/条件分岐変数の定義・関数の定義letfoobar = 10;;letfoobar = 15andfoobar2 = 20;;lettestfunc a = print_string “answer is “;print_int (a + 30) ;;lettestfunc a b = a + b;;lettestfun a:int = a;;スコープ付き変数・関数の定義letfoobar = 10 in foobar + 10 ;;名前無し関数(closure)定義	fun a -> a + 10;;	let testfunc a b = a + b;;   ===== let testfunc = fun a b -> a + b;;これは再代入とは違うので注意!!(新規に領域を作って名前をbindしている)連続した命令は”;”で分ける引数の型は明示的にも宣言可
関数/条件分岐条件分岐 let testFunc a b = 	if (a > b) then		a	else 		bIf 式自身も値を返す構文であることに注目そのためにelseは必須
関数/条件分岐If節の中に複数の命令を入れる場合は注意が必要条件分岐 let testFunc a b = 	if (a > b) then		(print_string “a > b”; a)	else 		(print_string “a =< b”; b)括弧の中を左から評価して最後の値を返す注意:最後以外はunitを返さないとwarning()の代わりにbegin … endでもOK

Ocaml lecture slides 01 at axsh