[1; 2; 3]
[]
[2; 3]
[2; 3]
head :: tail
[1; 2; 3] 1 :: [2; 3] 1 :: 2 :: [3] 1 :: 2 :: 3 :: []
int list
foo
foo list
'a list
'a list
'a list
List
length
List.length
List.lenght
List.lenght
List.length: 'リスト-> int
struct
struct
struct pair_of_ints {
int a、b;
};
(3,4)
int * int
int * string * char
タイプpair_of_ints = {a:int; b:int} ;;
{a = 3; b = 5}
#type pair_of_ints = {a:int; b:int} ;;
タイプpair_of_ints = {a:int; b:int; }
#{a = 3; b = 5} ;;
-:pair_of_ints = {a = 3; b = 5}
#{a = 3} ;;
一部のレコードフィールドラベルは未定義です:b
struct foo {
int型;
#define TYPE_INT 1
#define TYPE_PAIR_OF_INTS 2
#define TYPE_STRING 3
ユニオン{
int i; // type == TYPE_INTの場合。
intペア[2]; // type == TYPE_PAIR_OF_INTSの場合。
char * str; // type == TYPE_STRINGの場合。
} u;
};
ui
enum
type
タイプfoo = Nothing | intのint | int * intのペア| 文字列の文字列;;
of part
Nothing
なし
Int 3
ペア(4、5)
ストリング「hello」
&c。
foo
of
of
列挙記号{正、ゼロ、負};
タイプ記号=正| ゼロ| 負の;;
タイプbinary_tree = intのリーフ| binary_tree * binary_treeのツリー;;
葉3 ツリー(リーフ3、リーフ4) ツリー(ツリー(リーフ3、リーフ4)、リーフ5) ツリー(ツリー(リーフ3、リーフ4)、ツリー(ツリー(リーフ3、リーフ4)、リーフ5))
タイプ「a binary_tree = Leaf of」a | 'a binary_tree *'のツリーbinary_tree ;;
int binary_tree
string binary_tree
string binary_tree
#リーフ "hello" ;; -:string binary_tree = Leaf "hello" #リーフ3.0 ;; -:float binary_tree = Leaf 3。
int list
a' list
タイプ 'a list = [] | :: 'a *'リスト(*これは実際のOCamlではありません*コード)
#type 'a list = Nil | :: 'a *'リスト;; タイプ 'a list = Nil | ::「a *」リスト #なし;; -: 'a list = Nil #1 ::なし;; -:int list = ::(1、Nil) #1 :: 2 :: Nil ;; -:int list = ::(1、::(2、Nil))
[1; 2; 3]
[1; 2; 3]
[1; 2; 3]
1 :: 2 :: 3 :: []
a' list
| OCamlの名前 | タイプ定義の例 | 使用例 |
|---|---|---|
| リスト | intリスト | [1; 2; 3] |
| タプル | int *文字列 | (3、「こんにちは」) |
| 記録する | タイプペア= {a:int; b:文字列} | {a = 3; b = "hello"} |
| 異形 | タイプfoo = intのint
| int *文字列のペア | Int 3 |
| 異形 | タイプ記号=正| ゼロ
| 負 | ポジティブ
ゼロ |
| パラメータ化された
異形 | タイプ 'a my_list =空
| 'a *'の短所my_list | 短所(1、短所(2、空)) |
タイプexpr =プラスexpr * expr(*はa + b *を意味します)
| expr * exprのマイナス(*はa-b *を意味します)
| expr * exprの時間(*はa * b *を意味します)
| expr * exprの除算(*はa / bを意味します*)
| 文字列の値(* "x"、 "y"、 "n"など。*)
;;
時間(値 "n"、プラス(値 "x"、値 "y"))
n * (x+y)
(Value "n", Plus (Value "x", Value "y"))
let rec_string e =
eと一致
プラス(左、右)-> "(" ^(to_string left)^ "+" ^(to_string right)^ ")"
| マイナス(左、右)-> "(" ^(to_string left)^ "-" ^(to_string right)^ ")"
| 時間(左、右)-> "(" ^(to_string left)^ "*" ^(to_string right)^ ")"
| 分割(左、右)-> "(" ^(to_string left)^ "/" ^(to_string right)^ ")"
| 値v-> v
;;
let print_expr e =
print_endline(to_string e);;
^
#print_expr(Times(値 "n"、Plus(値 "x"、値 "y")));; (n *(x + y))
オブジェクトを一致させる
パターン->結果
| パターン->結果
...
to_string
to_string
n * (x + y)
(x + y) * n
let recマルチプルアウトe =
eと一致
時間(e1、プラス(e2、e3))->
プラス(時間(multiply_out e1、multiply_out e2)、
時間(multiply_out e1、multiply_out e3))
| 時間(プラス(e1、e2)、e3)->
プラス(時間(multiply_out e1、multiply_out e3)、
時間(multiply_out e2、multiply_out e3))
| プラス(左、右)->プラス(左にmultiply_out、右にmultiply_out)
| マイナス(左、右)->マイナス(左にmultiply_out、右にmultiply_out)
| 時間(左、右)->時間(左に乗算_アウト、右に乗算_アウト)
| 分割(左、右)->分割(multiply_out左、multiply_out右)
| 値v->値v
;;
#print_expr(multiply_out(Times(値 "n"、Plus(値 "x"、値 "y")));; ((n * x)+(n * y))
Time (e1, Plus (e2, e3))
e1 * (e2 + e3)
(e1 * e2) + (e1 * e3)
(e1 + e2) * e3
multiply_out
e -> e
因数分解e =
eと一致
Plus(Times(e1、e2)、Times(e3、e4))e1 = e3-> Times(e1、Plus(e2、e4))の場合
| Plus(Times(e1、e2)、Times(e3、e4))e2 = e4-> Times(Plus(e1、e3)、e4)
| e-> e
;;
#factorize(Plus(Times(値 "n"、値 "x")、Times(値 "n"、値 "y"));; -:expr = Times(値 "n"、プラス(値 "x"、値 "y"))
when
when
オブジェクトを一致させる
パターン[when条件]->結果
パターン[when条件]->結果
...
=
Product
expr
タイプexpr =プラスexpr * expr(*はa + b *を意味します)
| expr * exprのマイナス(*はa-b *を意味します)
| expr * exprの時間(*はa * b *を意味します)
| expr * exprの除算(*はa / bを意味します*)
| exprリストの積(*はa * b * c * ... *を意味します)
| 文字列の値(* "x"、 "y"、 "n"など。*)
;;
警告:このパターンマッチングは完全ではありません。 一致しない値の例を次に示します。 製品_