このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

EDocのtype定義

@type の左辺は関数呼び出し形式、総称の型パラメータを入れてよい。


@type pair(X, Y) = {X, Y}

別名や一部束縛は次のようにする。


@type tuple_2(X, Y) = pair(X, Y)
@type tuple_2_atom(Y) = tuple_2(atom(), Y)

レコード型の型定義は次のようにする。


@type person() = #person {
nickname = atom(),
real_name = string(),
age = integer()
}

レコード型の直接指定は #person{}。中括弧を忘れないこと!

次のようにタプル成分(element, リストはmember)にラベルを付けられる。


@type person() = {Nickname::atom(), RealName::string()}

注意すべきこと、いろいろ

右辺に大文字から始まる名前を使った「型のマクロ定義」はできない。@specのwhere節とは違う。

cons(,)と[]が使える。このとき、リストのメンバーにもラベルが付けられる。

Erlangの型システムとは違い、string() や none() 型が使えることに注意。

@specで書いた引数名はデフォルト(関数定義の名前)を上書きする。

次の例では、引数名Nameはなくなる。


% @spec (N) -> none()
% where N = string()
foo(Name) -> ok.

次は上書きされる(引数名がNamになる)。


% @spec (Nam:N) -> none()
% where N = string()
foo(Name) -> ok.