Hatena::Grouperlang

msyktの日記

 | 

2013-10-31

2.9 タプル(p.20)

23:59

Cと違うのは、タプルの各フィールドには名前がない点だ。タプル自体は整数のペアを持つだけなので、タプルが何に使われているかを覚えておかないといけない。タプルが何に使われているかを思い出しやすくするため、タプルが表現するものを示すアトムを最初の要素に入れておくことが多い。

このCの構造体とタプルの比較の話はなるほどと思った。普段タプルがある言語を使わないので気にしたことが無かったが、最初の要素に識別子を入れるというのはそういう対比で説明できるのか。

複雑なタプルから値を取り出すには、タプルと同じ形(構造)で、タプルの取り出したい値に対応する箇所に未束縛変数を置いたパターンを書けばよい。

シンボル_は無名変数と呼ばれる。_は通常の変数とは異なり、1つのパターンの中で何度か使う場合でも同じ値に束縛されなくても良い。

「_」は無名変数と呼ぶのか。てっきりワイルドカードなのかと思ってた。

Eshell V5.10.1  (abort with ^G)
1> A = {foo, {bar, {hoge, hogehoge}}}.
{foo,{bar,{hoge,hogehoge}}}
2> {_, {_, {_, Deepest}}} = A.
{foo,{bar,{hoge,hogehoge}}}
3> Deepest.
hogehoge
プログラミングErlang

プログラミングErlang

2.10 リスト(p.22)

00:29

[...|T]構築子を使ってリストを作るときは、Tが必ずリストであるように気を付けなければならない。Tがリストならば、作ったリストは「正しい形式」になる。Tがリストではない場合、出来上がったリストを「不正な形式」であるという。ライブラリ関数のほとんどはリストが正しい形式であると仮定していて、不正なリストに対しては正しく機能しない。

リストはこの部分だけ気になった。

Eshell V5.10.1  (abort with ^G)
1> A = [1, 2].  
[1,2]
2> B = 3.
3
3> C = [0 | A].
[0,1,2]
4> D = [0 | B].
[0|3]
5> is_list(D).
true
6> [E | F] = D.
[0|3]
7> E.
0
8> F.
3

Tにリスト以外の値である「3」を指定してリストを構築してみたら、[0|3]という不思議なリストができてしまった。[H|T]のパターンマッチで値を取り出せるけど、Tがリストではないので、Tがリストだと仮定するとエラーになってしまうのだろうか。[...|T]で構築する際、Tがリストでなければエラーとすれば良いと思うのだけれども、敢えてリスト以外も許容するのに何か理由があるのかな。

プログラミングErlang

プログラミングErlang

 |