Może masz na myśli coś takiego:
-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.
Test:
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()]
oznacza, że typ pola znajduje się lista dodatnich liczb całkowitych, począwszy od 1
; jest to wskazówka dla narzędzia analitycznego dialyzer
, gdy wykonuje sprawdzanie typu.
Erlang pozwala również użyć dopasowywania wzoru na wyniki:
5> reclist:get_clients(reclist:some_state()).
[1,2,3]
dalszego czytania:
@JUST MOJA poprawna OPINIA answer zmusiła mnie do zapamiętania, że uwielbiam jak Haskell pobiera wartości pól w typie danych.
Oto definicja typu danych, skradzionym z Learn You a Haskell for Great Good!, który wykorzystuje zapis składni:
data Car = Car {company :: String
,model :: String
,year :: Int
} deriving (Show)
Tworzy funkcje company
, model
i year
, że pola odnośnika w typie danych. My najpierw dokonać nowego samochodu:
ghci> Car "Toyota" "Supra" 2005
Car {company = "Toyota", model = "Supra", year = 2005}
Albo, stosując zapis składni (kolejność pól nie ma znaczenia):
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
Możemy nawet użyć dopasowywania wzoru:
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"
Pamiętam, że były próby wprowadzenia czegoś podobnego do składni Haskella w Erlangu, ale nie byłem pewien, czy udało im się.
niektórych stanowisk, dotyczące tych prób:
Wydaje się, że LFE używa makra, które są podobne do tego, co zapewnia schematem (Racket, na przykład), gdy chcesz utworzyć nową wartość pewnej strukturze:
> (define-struct car (company model year))
> (define supra (make-car "Toyota" "Supra" 2005))
> (car-model supra)
"Supra"
Mam nadzieję, że” Będą mieć coś zbliżonego do składni Haskella w przyszłości, co byłoby naprawdę praktyczne i przydatne.
ewps, to "dializator". Więcej na temat Erlanga [Records] (http://www.erlang.org/doc/programming_examples/records.html). –
Och, powinno to być 'clients = [] :: [pos_integer()],' –
Nie możesz edytować swojego posta, aby zaktualizować go za pomocą 2600 punktów? – ndim