2015-05-26 7 views
6

Sto provando a specificare una funzione in un file di intestazione. Come così:Specifiche multiple per la stessa funzione nel file di intestazione Erlang

-spec update(pid(), tuple(tuple(), integer(), atom()), tuple(atom(), atom())) -> tuple(tuple(), integer(), atom()). 

ora voglio aggiungere qualche specifica in più per questa funzione perché ha più parametri diversi.

update(_Pid, {Specs, infinity, _State}, {Step}) -> 
    timer:sleep(10000), 
    {{Specs, infinity}, {Step}}; 
update(_Pid, {Specs, infinity, _State}, {ExtraInfo, Step}) -> 
    timer:sleep(10000), 
    {{Specs, infinity}, {ExtraInfo, Step}}; 
update(_Pid, {Specs, N, _State}, _Info) when N < 2 -> 
    {Specs, N, stop}; 
update(_Pid, {Specs, N, _State}, {notTaken, Step}) -> 
    {Specs, N, Step}; 
update(_Pid, {Specs, N, _State}, {taken, Step}) -> 
    {Specs, N - 1, Step}. 

quindi voglio aggiungere queste specifiche in più, per i vari parametri in questa funzione, nel mio file di intestazione. Non so come farlo, qualcuno potrebbe aiutarmi con questo?

ho cercato di fare questo, ma mi dà errori di compilazione:

-spec update(pid(), tuple(tuple(), integer(), atom()), tuple(atom(), atom())) -> tuple(tuple(), integer(), atom()). 
-spec update(pid(), tuple(tuple(), atom(), atom()), tuple(integer(), atom())) -> tuple(tuple(), atom(), atom()). 
-spec update(pid(), tuple(tuple(), atom(), atom()), tuple(atom())) -> tuple(tuple(), atom(), atom()). 

Grazie in anticipo.

risposta

2

trovato la risposta qui: http://erlang.org/doc/reference_manual/typespec.html

ho dovuto utilizzare il ';'

cambiamento questo:

-spec update(pid(), tuple(tuple(), integer(), atom()), tuple(atom(), atom())) -> tuple(tuple(), integer(), atom()). 
-spec update(pid(), tuple(tuple(), atom(), atom()), tuple(integer(), atom())) -> tuple(tuple(), atom(), atom()). 
-spec update(pid(), tuple(tuple(), atom(), atom()), tuple(atom())) -> tuple(tuple(), atom(), atom()). 

in questo:

-spec update(pid(), tuple(tuple(), integer(), atom()), tuple(atom(), atom())) -> tuple(tuple(), integer(), atom()); 
      (pid(), tuple(tuple(), atom(), atom()), tuple(integer(), atom())) -> tuple(tuple(), atom(), atom()); 
      (pid(), tuple(tuple(), atom(), atom()), tuple(atom())) -> tuple(tuple(), atom(), atom()). 
+0

Questo è corretto. Posso chiedere perché vuoi metterlo in un file di intestazione, però? –

+0

Per rendere il mio codice robusto e ha funzionalità che possono essere duplicate. –

+1

Hai mai pensato di utilizzare il meccanismo -callback con i comportamenti? Ti permettono di inserire le specifiche del tipo sulla definizione del comportamento piuttosto che ripeterlo in molti punti. –

Problemi correlati