Ocamlのリストとその他のデータ構造

はじめに



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]

リストを操作するためのその他の関数は、リストライブラリで定義されています。



All Articles