SlideShare a Scribd company logo
1 of 42
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.aspx Standard 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/ Haskell Closure Concurrent Clean Lisp/scheme
特徴 型推論があるので(ある程度)プログラムのエラーを静的に解析できる パターンマッチによって複雑な条件式が簡潔に書ける 高階関数(Higher Order Function)や多相型(Polymorphic Type)によってより柔軟な処理の記述が可能
最終的なGoal Ocamlのプログラムのコンパイルの仕方,実行方法が分かるようになる 関数型言語の知識が(少し)分かるようになる(型推論とか,パターンマッチングとか…) 関数型言語っぽいプログラミングのマナーを知る(再帰脳・リスト指向・高階関数使用)
目次 ,[object Object]
リスト・ペア
レコード
バリアント
パターンマッチ
再帰
多相型について
多相型関数
多相型データインストール “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 Linux Ports/pkgsrc for *BSD
とりあえずhello world! Nativeバイナリ版はあとで解説しまつ Windowsで Unixで
解説 kagaribi% ocaml         Objective Caml version 3.10.2 # print_string "hello world!";; hello world!- : unit = () # ^D kagaribi% プログラムの入力 プロンプト 出力 プログラムの型 ”^d”で終了
プログラム解説 # print_string“hello world!”;; 関数名 引数 ターミネーター ,[object Object]
文字列は””で囲む
プログラムを評価したい場合には”;;”を末尾に
評価については2枚後で説明
print_stringは文字列を受けとって表示する関数,[object Object]
“評価”とは? 与えられたOcaml式をコンピュータが解析すること 関数に全ての引数が与えられたら実行 kagaribi% ocaml         Objective Caml version 3.10.2 # print_string “test string”;;←関数に引数を加えて評価 test string- : unit = ()←実行される # 10;;←数字を評価 ,[object Object],# print_string;;←関数を評価すると? - : string -> unit = <fun>←関数が返ってくる #
Type, Type, Type!!! (1) 型推論する関数型言語にとって型は命です int	:31bit整数型 (Int32, Int64という型もあります) float	: 不動小数点型 (doubleっぽい) string	: 文字列型  (“test” で表記) char 	: 文字型(‘a’ で表記) bool	: true/false unit	: 値を返さない型.値は()のみ 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>
目次 ,[object Object]
リスト・ペア
レコード
バリアント
パターンマッチ
再帰
多相型について
多相型関数
多相型データインストール “Hello world!” プログラムの起動・終了 プログラムの解説 その他 型について 関数 関数定義 条件分岐 再帰
関数/条件分岐 変数の定義・関数の定義 letfoobar = 10;; letfoobar = 15 andfoobar2 = 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  		b If 式自身も値を返す構文であることに注目 そのために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

More Related Content

What's hot

Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
 
C++ Template Metaprogramming
C++ Template MetaprogrammingC++ Template Metaprogramming
C++ Template Metaprogramming
Akira Takahashi
 
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用までTemplate Meta Programming入門から応用まで
Template Meta Programming入門から応用まで
yoshihikoozaki5
 

What's hot (20)

クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
 
C++0x総復習
C++0x総復習C++0x総復習
C++0x総復習
 
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
yieldとreturnの話
yieldとreturnの話yieldとreturnの話
yieldとreturnの話
 
エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみた
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
すごいConstたのしく使おう!
すごいConstたのしく使おう!すごいConstたのしく使おう!
すごいConstたのしく使おう!
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
 
C++ Template Metaprogramming
C++ Template MetaprogrammingC++ Template Metaprogramming
C++ Template Metaprogramming
 
ちょっと詳しくJavaScript 第3回【prototype】
ちょっと詳しくJavaScript 第3回【prototype】ちょっと詳しくJavaScript 第3回【prototype】
ちょっと詳しくJavaScript 第3回【prototype】
 
Boost jp9 program_options
Boost jp9 program_optionsBoost jp9 program_options
Boost jp9 program_options
 
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用までTemplate Meta Programming入門から応用まで
Template Meta Programming入門から応用まで
 
Emcpp item31
Emcpp item31Emcpp item31
Emcpp item31
 

Similar to Ocaml lecture slides 01 at axsh

Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
時響 逢坂
 
プログラミングで言いたい聞きたいこと集
プログラミングで言いたい聞きたいこと集プログラミングで言いたい聞きたいこと集
プログラミングで言いたい聞きたいこと集
tecopark
 
プログラミングで言いたいこと聞きたいこと集
プログラミングで言いたいこと聞きたいこと集プログラミングで言いたいこと聞きたいこと集
プログラミングで言いたいこと聞きたいこと集
tecopark
 
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk
mitamex4u
 
GADTブランチの今
GADTブランチの今GADTブランチの今
GADTブランチの今
啓 小笠原
 
T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日
Go Tanaka
 
プログラマ講習第3回
プログラマ講習第3回プログラマ講習第3回
プログラマ講習第3回
Yuma Yoshimoto
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
yak1ex
 

Similar to Ocaml lecture slides 01 at axsh (20)

C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
CLR/H No.35-2
CLR/H No.35-2CLR/H No.35-2
CLR/H No.35-2
 
プログラミングで言いたい聞きたいこと集
プログラミングで言いたい聞きたいこと集プログラミングで言いたい聞きたいこと集
プログラミングで言いたい聞きたいこと集
 
プログラミングで言いたいこと聞きたいこと集
プログラミングで言いたいこと聞きたいこと集プログラミングで言いたいこと聞きたいこと集
プログラミングで言いたいこと聞きたいこと集
 
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk
 
GADTブランチの今
GADTブランチの今GADTブランチの今
GADTブランチの今
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICL
 
本当は怖いPHP
本当は怖いPHP本当は怖いPHP
本当は怖いPHP
 
プロトコル指向 - 夢と現実の狭間 #cswift
プロトコル指向 - 夢と現実の狭間 #cswiftプロトコル指向 - 夢と現実の狭間 #cswift
プロトコル指向 - 夢と現実の狭間 #cswift
 
20180728 halide-study
20180728 halide-study20180728 halide-study
20180728 halide-study
 
T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日
 
プログラマ講習第3回
プログラマ講習第3回プログラマ講習第3回
プログラマ講習第3回
 
Swiftおさらい
SwiftおさらいSwiftおさらい
Swiftおさらい
 
Python standard 2022 Spring
Python standard 2022 SpringPython standard 2022 Spring
Python standard 2022 Spring
 
初めてのSTL
初めてのSTL初めてのSTL
初めてのSTL
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 

More from Tomofumi Hayashi

More from Tomofumi Hayashi (9)

CNIふぉーびぎなーず
CNIふぉーびぎなーずCNIふぉーびぎなーず
CNIふぉーびぎなーず
 
4 rhtn tohayash-multus
4 rhtn tohayash-multus4 rhtn tohayash-multus
4 rhtn tohayash-multus
 
Opnfv primer how to get into opnfv
Opnfv primer  how to get into opnfv Opnfv primer  how to get into opnfv
Opnfv primer how to get into opnfv
 
コンテナのネットワークインターフェース その実装手法とその応用について
コンテナのネットワークインターフェース その実装手法とその応用についてコンテナのネットワークインターフェース その実装手法とその応用について
コンテナのネットワークインターフェース その実装手法とその応用について
 
Opnfv handson apex intro
Opnfv handson apex introOpnfv handson apex intro
Opnfv handson apex intro
 
OpenStack Summit Boston DMA Appendix
OpenStack Summit Boston DMA AppendixOpenStack Summit Boston DMA Appendix
OpenStack Summit Boston DMA Appendix
 
Software forwarding path
Software forwarding pathSoftware forwarding path
Software forwarding path
 
OPNFV Meetup Tokyo #1 / Projects Summary
OPNFV Meetup Tokyo #1 / Projects SummaryOPNFV Meetup Tokyo #1 / Projects Summary
OPNFV Meetup Tokyo #1 / Projects Summary
 
nftables: the Next Generation Firewall in Linux
nftables: the Next Generation Firewall in Linuxnftables: the Next Generation Firewall in Linux
nftables: the Next Generation Firewall in Linux
 

Ocaml lecture slides 01 at axsh