【回転】Erlang基本データ型


データ型について述べる前に、Erlangの変数を簡単に紹介します.Erlangの変数は他の言語の変数と3つ違います.
1.Erlangは変数のタイプを定義せず、任意のタイプの値に割り当てることができ、Erlangのすべてのタイプの値を総称してTermと呼ぶ.これにより、コンパイラはコンパイル時に数値タイプの不一致を発見することができず、実行時にエラーを発見するだけで、C++のように強制タイプでマスクシステムを変換することができず、メモリの漏洩をもたらし、ErlangがC++のようにコードの問題を発見しやすいという利点がある.しかし、Erlangには現在、dialyzerによってコード内の不一致を検索できる関数の定義メカニズムがあります.
2.Erlangの変数は1回のみ割り当てられ、2回目の割り当てはコンパイラによって比較として理解され、値が同じであればその値が返され、異なる場合は例外が放出されます.
3.Erlangの変数は大文字または下線で始まる必要があります.そうしないと、コンパイラでは変数として理解されず、大文字と下線で始まる変数には異なる動作があります.
 
一.Number
1.整数(integer)−整数は、例えば、1212375および−23427のような一連の10進数として記載される.整数の算術演算は正確で、精度の制限がありません
2.浮動小数点数(float)−浮動小数点数はIEEE 754[43]の規則を満たす64ビット浮動小数点数として表される.すべて±10 E 308の範囲内の実数はすべてErlang浮動小数点数で表すことができる.
3.$charで文字を取得するASCII値のサポート
4.2-36進数の表示をサポートする、例えば3#11で4.
 
二.Atom
定数に似ています.一般的には小文字で始まるアルファベットで構成されていますが、大文字で始まるか、アルファベット、下線、@以外の文字が含まれている場合は、Atomを表すために引用符で表す必要があります.
AtomはC++の定数よりも使いやすく、例えばcircle、lineを直接使って異なるグラフィックタイプを表すことができます.CIRCLE、LINE定数を定義する必要はありません.
Atomは使いやすいが乱用できない.Atomを使うには次のような弊害があるからだ.
1.Atomはatom tableに保存され、1つのAtomが4バイト(32 bit)または8バイト(64 bit)を占有し、メモリを持続的に占有し、ゴミ回収に関与せず、またそれ自体も1048577個を超えない制限がある.
2.Atomは比較のみ可能であり、区切り、マッチングなどの処理は一切できません.
 
Erlangの予約語は次のとおりです.
after and andalso band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse query receive rem try when xor
 
三.Tuple
Objectと似ていますが、長さは固定されています.形式は次のとおりです.
{Term1,...,TermN}
パターンマッチングでTupleの値を簡単に取得できます.
 
四.List
形式は次のとおりです.
[Term1,...,TermN]
HeadとTailは|で接続できます.Headは任意のTermであり、Tailはリストでなければなりません.
例えば[1|2]は正常に実行できるがlengthなどの内蔵関数では使用できない.
次の点に注意してください.
length(1|[2,3])は3であるが
length([1,2]|3)は2
リストのHeadは、パターンマッチング方式で順次取得することができる.
 
Listはクエリー式の操作もサポートしており、使用方法は以下の通りである.
NewList = [Expression || GeneratorExp1, GeneratorExp2, ..., GeneratorExpN, Condition1, Condition2, ... ConditionM]
例えば、Xの値が1または5である、Yの値が6または7である、3で割り切れるXとYを見つけなければならない.
[{X,Y}||X<-[1,5],Y<-[6,7],(X+Y) rem 3 =:=0].

 
出力[{5,7}]
 
五.Bit Strings
Bit Stringsはタイプのないメモリ領域を表し、表現形式は<>.
ここで、Eiの形式は、ValueまたはValue:SizeまたはValue/TypeSpecifierListまたはValue:Size/TypeSpecifierListである
Type-SpecifierListの形式はType-Signedness-Endianness-unit:IntegerLiteral.
ここでTypeはinteger(default)、float、binary、bytes、bitstring、bits、utf 8、utf 16、utf 32の形式であってもよい
Signednessはsignedまたはunsigned(default)であってもよい
Endiannessはbig(default)、little、nativeであってもよい
IntegerLiteralの値範囲は1-256で、この値はメモリ領域を拡張するために使用され、元の領域をSize*(IntegerLiteral-1)ビットに拡張し、デフォルト値は1で、拡張しません.
メモリ領域のある位置の値をパターンマッチングで簡単に取得でき、Erlangでデータを処理するのは便利ですが、Erlangで大量のデータを処理するのはお勧めできません.Erlangはデータ処理がC++より遅いためです.
 
Bit StringsのすべてのEiのSizeが8の場合、Binariesと呼ばれます.
Binariesはクエリー式の操作もサポートしており、実際にBinariesはリストをクエリーでき、リストもBinaryをクエリーできる.最も直感的なのはやはり例を挙げてみましょう.
1.ListがListを得る
[2*N || N <- [1,2,3,4]].
[2,4,6,8]

 
2.ListはBinaryを取得し、タイプやsizeを明記することに注意します.
<<<<(N*2):8>> || N <- [1,2,3,4]>>.<<2,4,6,8>>

 
3.BinaryはListを得て、注意<-が<=になりました
[2*N || <<N>> <= <<1,2,3,4>>].
[2,4,6,8]

 
4.Binary Binaryを入手
<<<<(N*2):8>> || <<N>> <= <<1,2,3,4>>>>.<<2,4,6,8>>

 
六.Fun
関数オブジェクト、関数オブジェクトに値を割り当てるには2つの方法があります.
1.匿名関数を関数オブジェクトに割り当てます.
匿名関数の形式は次のとおりです.
fun
    (Pattern11,...,Pattern1N) [when GuardSeq1] ->
        Body1;
    ...;
    (PatternK1,...,PatternKN) [when GuardSeqK] ->
        BodyKend

 
2.定義された関数を関数オブジェクトに割り当てます.形式は次のとおりです.
fun Name/Arityfun Module:Name/Arity
ここでNameは関数名、Arityはパラメータの個数を表します.
 
七.String
Stringは二重引用符と文字列で表され、本質はListである.例えば「hello」は[$h,$e,$l,$l,$o]に等価である.
2つの隣接する文字列は、「he」「llo」が「hello」に等しい文字列に結合されます.
文字列はBinaryで表すこともできます.
 
八.Record
RecordはStructに似ており、Record式はコンパイル時にtuple式に変わります.
1.レコードの定義:
-record(Name, {Field1 [= Value1],
               ...
               FieldN [= ValueN]}).

 
2.新規レコード:
#Name{Field1=Expr1,...,FieldK=ExprK}
一部のFieldは省略できます.この場合、これらのFieldはデフォルト値を取得します.
 
複数のFieldに同じ値を割り当てる必要がある場合は、次のようにします.
#Name{Field1=Expr1,...,FieldK=ExprK, _=ExprL}
このとき省略されたフィールドはすべてExprLに割り当てられます
 
3.Field:Expr#Name.へのアクセスField
 
4.Fieldの更新
Expr#Name{Field1=Expr1,...,FieldK=ExprK}
 
九.Boolean
このタイプはありませんが、Boolean値はtrueとfalseで表すことができます.trueとfalseは、次のような判断を行う場合に正常に使用できます.
true and false.false or true.true xor false.not false.not (true and true).
しかしC++と同じように数字として使うことはできません.ErlangではAtom値であることを覚えておいてください.
十.Pid
PidはProcess Identifier(プロセス識別子)の略で、PidはErlangのspawn(…)原語によって作成され、PidはErlangプロセスの参照である.現在のプロセスのpidはself()で取得できます.印刷形式:<0.35.0>
十一.port
ポートは外部と通信するために使用され、内蔵関数(BIF 3)open_portで作成します.メッセージはポートを介して送受信できますが、これらのメッセージはいわゆる「ポートプロトコル」(port protocol)のルールに従う必要があります.ポートとプロセスの差は多くありませんが、外部と通信することもできます.ポートの印刷フォーマット:#Port<0.472>
十二.reference
referenceリファレンスは、グローバルで一意のシンボルであり、2つのリファレンスが等しいかどうかを比較するためにのみ使用されます.参照はErlang原語make_を呼び出すことができます.ref()は創造します.印刷形式は#Ref<0.0.0.39>です.参照は、一意性を保証する様々な使い捨てラベルまたはクッキーとしてよく使用される.
 
十三タイプ変換
1.tuple以外to_Listがlistに変換されると、文字列に変換できるようになります.
atom_to_list(hello)."hello"binary_to_list(<<"hello">>)."hello"binary_to_list(<<104,101,108,108,111>>)."hello"float_to_list(7.0)."7.00000000000000000000e+00"integer_to_list(77)."77"tuple_to_list({a,b,c}).
[a,b,c]

2.Number回転binaryは文字列に変換されました
integer_to_binary(77).<<"77">>float_to_binary(7.0).<<"7.00000000000000000000e+00">>

 
3.その他の変換
list_to_atom("hello").
hello
list_to_binary("hello").<<104,101,108,108,111>>list_to_float("7.000e+00").7.0list_to_integer("77").77list_to_tuple([a,b,c]).
{a,b,c}
term_to_binary({a,b,c}).<<131,104,3,100,0,1,97,100,0,1,98,100,0,1,99>>binary_to_term(<<131,104,3,100,0,1,97,100,0,1,98,100,0,1,99>>).
{a,b,c}
binary_to_integer(<<"77">>).77binary_to_float(<<"7.000e+00>>").7.0

 
十四.タイプ判定
is_atom/1           
is_binary/1        
is_bitstring/1      
is_boolean/1        
is_builtin/3       
is_float/1          
is_function/1       
is_function/2      
is_integer/1        
is_list/1           
is_number/1        
is_pid/1            
is_port/1           
is_record/2         
is_record/3         
is_reference/1      
is_tuple/1