[erlang-questions] Erlang type spec questions

zxq9 <>
Thu Oct 15 01:23:39 CEST 2015

On 2015年10月14日 水曜日 18:38:35  wrote:
> Hello,
> 1. -spec open_read(Table :: list(), Type :: atom()) -> {ok, Name} | {error, Reason}.
> Gives me Error: ...Reason is unbound
> Question: How should I represent?

When the spec gets even slightly too long for a single line I tend to do this:

-spec open_read(Table, Type) -> {ok, Name} | {error, Reason}.
    when Table  :: ets:tab(),
         Type   :: atom(),
         Name   :: unicode:chardata(),
         Reason :: term().

or whatever applies to Name and Reason.

> 2. How does one represent a File?
> E.g. -type get_tags(File :: ??? 


This is a general type; a union of `pid() | file:fd()`.

Check out the "Data types" section:

> 3. Is a dets table a file or a list? 
> E.g. How would one represent it?

Similar to the above:


Same place in the docs format, under "Data types":

I don't recall that there is any place in the manual that actually says "the page for each module has a section of exported types called 'data types', and each type can be used in your programs by using the module in question as a module type prefix." There maybe should be a note like that somewhere, and may be, but I don't recall ever seeing it. Nearly every unique structure in the whole system has an exported type to represent it. Sometimes they are as simple as `foo:name() :: atom()`, but using the exported name *instead* of atom makes your code understandable at a glance and future-proofs it against the underlying value ever changing in a later release.


More information about the erlang-questions mailing list