はじめに
Objective Camlの基本的なデータ型に加えて、事前定義された型にはタプル、リスト、レコードが含まれます。
タプル
さまざまなタイプの値をグループ化して、一般的なデータ構造( タプル )にすることができます。 タプルを構成する値はコンマで区切られます。 記号*は 、タプルを作成するために使用されます。
文字列* charとしましょう-最初の要素が文字列で2番目の文字であるタプルがあります。
#( "Habrahabr"、 'A');;
-:文字列* char = "Habrahabr"、 'A'
#(100,10.2);;
-:int * float = 100,10.2
タプルの宣言で角括弧(...)の使用を避けることもできます。原則として違いはありませんが、角括弧を使用すると、読みやすくなります。
# "Habrahabr"、 'A' ;;
-:文字列* char = "Habrahabr"、 'A'
上記の例でわかるように、括弧がなければ結果は変わりません。
タプルを操作するための関数:
fst-タプルの最初の要素を返します
snd-タプルの2番目の要素を返します
どちらの関数も多態的です。つまり、入力引数は任意の型にすることができます。
#fst ;;
-: 'a' * 'b'-> 'a = #fst(100,10);;
-:int = 100
投稿
レコードは、それぞれに名前が付けられたタプルです。 エントリは常に新しい型宣言と一致します。 新しいレコードを定義するには、その名前と、レコードの各フィールドの名前とタイプを指定する必要があります。つまり、レコードを宣言するための構文は次のとおりです。
タイプrecordName = {field1:dataType; field2:dataType}
typeはObjective Camlのキーワード、recordNameはレコードの名前、field1、field1はレコードのフィールド、dataTypeはレコードフィールドのデータ型です。 この基本的なレコード記述構文構造を使用して、Objective Camlのレコードを記述できます。
タイプcomplexNum = {real:float; im:float} ;;
タイプcomplexNum = {real:float; im:float}
レコードタイプの値を作成するには、各レコードフィールドに値を割り当てる必要があります。
次の例では、実数部が6、虚数部が8になる複素数を作成します。
タイプcomplexNum = {real:float; im:float} ;;
タイプcomplexNum = {real:float; im:float}
let num = {real = 6; im = 8}
val num:complexNum = {real = 6; im = 8}
レコードフィールドには、2つの方法を使用してアクセスできます。ポイント演算子-フィールドを取得するか、いくつかのフィールドを照合します。
1) expr.field
ここで、expr some expressionはレコードであり、fieldは必須レコードフィールドです。
2) {field1 = e1; ... fieldn = en}
ここで、e1、...、enは一致するパターンです。
タプルの前に書くことの利点は、より有益な説明です。 レコードフィールド名に感謝します。
リスト
同じタイプの値を組み合わせて、データ構造( リスト)にすることができます。 Objective Camlのリストは、空にすることも、同じタイプの要素を含めることもできます。
#[] ;;
-: 'リスト= []
#[1; 2; 3] ;;
-:int list = [1; 2; 3]
リストの先頭に新しい要素を追加するために、中置演算子として定義されている次の関数があります。
#1 :: [2; 3] ;;
-:int list = [1; 2; 3]
リストを結合するには、中置演算子@があります。
#[1] @ [2; 3] ;;
-:int list = [1; 2; 3]
リストを操作するためのその他の関数は、リストライブラリで定義されています。