[erlang-questions] type syntax question

Kostis Sagonas kostis@REDACTED
Thu Oct 30 09:05:44 CET 2008


Anthony Shipman wrote:
> I want to write something like
> 
> -type (deviceOpHandler() :: fun( (integer(), cstate()) -> cstate() )).
> 
> -spec (okHandler/2 :: deviceOpHandler()).
> 
> okHandler(_DeviceID, CState) ->
>     sendResponse(200, "OK", CState).
> 
> but I can't find the right combination of parentheses to please the compiler.
> Is this kind of specification possible?

The deviceOpHandler() does not need a "type" declaration.  In fact, it 
shouldn't have one for just the above.  In the old spec syntax, the 
above example can simply be written as:

   -spec(okHandler/2 :: (integer(), cstate()) -> cstate()).

or, from R12B-4 onwards, more simply as:

   -spec okHandler(integer(), cstate()) -> cstate().

which is now the recommended way -- the EEP needs to be updated.

If at some other function you need to specify that the function takes a 
deviceOpHandler as an argument, then you can define that type as:

   -type deviceOpHandler() :: fun((integer(), cstate()) -> cstate()).

and use it as:

   -spec my_foo(deviceOpHandler()) -> 42.


> Will there be documentation on the type and spec syntax coming soon?

Well, the answer depends on your definition of "soon"... ;-)

The current plan is that types & specs will be properly documented in R13.

Kostis



More information about the erlang-questions mailing list