Forse vuoi dire qualcosa come:
-module(reclist).
-export([empty_state/0, some_state/0,
add_client/1, del_client/1,
get_clients/1]).
-record(state,
{
clients = [] ::[pos_integer()],
dbname ::char()
}).
empty_state() ->
#state{}.
some_state() ->
#state{
clients = [1,2,3],
dbname = "QA"}.
del_client(Client) ->
S = some_state(),
C = S#state.clients,
S#state{clients = lists:delete(Client, C)}.
add_client(Client) ->
S = some_state(),
C = S#state.clients,
S#state{clients = [Client|C]}.
get_clients(#state{clients = C, dbname = _D}) ->
C.
prova:
1> reclist:empty_state().
{state,[],undefined}
2> reclist:some_state().
{state,[1,2,3],"QA"}
3> reclist:add_client(4).
{state,[4,1,2,3],"QA"}
4> reclist:del_client(2).
{state,[1,3],"QA"}
::[pos_integer()]
significa che il tipo di campo è un elenco di valori interi positivi, a partire dal 1
; è il suggerimento per lo strumento di analisi dialyzer
, quando esegue il controllo dei tipi.
Erlang permette anche di utilizzare il pattern matching sui record:
5> reclist:get_clients(reclist:some_state()).
[1,2,3]
Ulteriori approfondimenti:
@JUST I MIEI OPINION corretti answer mi hanno fatto ricordare che adoro come Haskell va a ottenere i valori dei campi nel tipo di dati.
Ecco una definizione di un tipo di dati, rubato da Learn You a Haskell for Great Good!, che sfrutta la sintassi di registrazione:
data Car = Car {company :: String
,model :: String
,year :: Int
} deriving (Show)
Si crea funzioni company
, model
e year
, che i campi di ricerca del tipo di dati. Per prima cosa facciamo una nuova auto:
ghci> Car "Toyota" "Supra" 2005
Car {company = "Toyota", model = "Supra", year = 2005}
Oppure, utilizzando la sintassi di registrazione (l'ordine dei campi non importa):
ghci> Car {model = "Supra", year = 2005, company = "Toyota"}
Car {company = "Toyota", model = "Supra", year = 2005}
ghci> let supra = Car {model = "Supra", year = 2005, company = "Toyota"}
ghci> year supra
2005
Possiamo anche usare il pattern matching:
ghci> let (Car {company = c, model = m, year = y}) = supra
ghci> "This " ++ C++ " " ++ m ++ " was made in " ++ show y
"This Toyota Supra was made in 2005"
Ricordo che c'erano tentativi di implementare qualcosa di simile alla sintassi dei record di Haskell in Erlang, ma non sono sicuro che avessero avuto successo.
Alcuni messaggi, relativi a questi tentativi:
Sembra che LFE utilizza le macro, che sono simili a quello che fornisce Scheme (Racket, per esempio), quando si desidera creare un nuovo valore di qualche struttura:
> (define-struct car (company model year))
> (define supra (make-car "Toyota" "Supra" 2005))
> (car-model supra)
"Supra"
Spero che' Avremo qualcosa di simile alla sintassi dei record di Haskell in futuro, che sarebbe davvero praticamente utile e utile.
ewps, è "dializzatore". Altro su Erlang [Records] (http://www.erlang.org/doc/programming_examples/records.html). –
Oh, avrebbe dovuto essere 'clients = [] :: [pos_integer()],' –
Non puoi modificare il tuo post per aggiornarlo con i tuoi 2600 punti di credito? – ndim