Может быть, вы имеете в виду что-то вроде:
-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.
Тест:
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()]
означает, что тип поля является список положительных целых чисел, начиная с 1
; это подсказка для инструмента анализа dialyzer
, когда он выполняет проверку типов.
Erlang также позволяет использовать сопоставление с образцом на записи:
5> reclist:get_clients(reclist:some_state()).
[1,2,3]
Далее чтение:
@JUST МОЙ правильный ОПИСАНИЕ answer ОПИСАНИЕ заставило меня вспомнить, что мне нравится, как Haskell собирается получать значения полей в типе данных.
Вот определение типа данных, похищенный из Learn You a Haskell for Great Good!, что рычагов синтаксиса записи:
data Car = Car {company :: String
,model :: String
,year :: Int
} deriving (Show)
Это создает функцию company
, model
и year
, что подстановочные поля в типе данных. Сначала сделать новый автомобиль:
ghci> Car "Toyota" "Supra" 2005
Car {company = "Toyota", model = "Supra", year = 2005}
Или, используя синтаксис записи (порядок полей не имеет значения):
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
Мы даже можем использовать сопоставление с образцом:
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"
Я помню, что были попытки реализовать что-то похожее на синтаксис записи Haskell в Erlang, но не уверены, были ли они успешными.
Некоторые сообщения, касающиеся этих попыток:
Кажется, что LFE использует макросы, которые похожи на то, что обеспечивает Scheme (Racket, например), когда вы хотите создать новое значение некоторой структуры:
> (define-struct car (company model year))
> (define supra (make-car "Toyota" "Supra" 2005))
> (car-model supra)
"Supra"
Я надеюсь, что мы» В будущем у вас будет что-то близкое к синтаксису записи Haskell, это будет действительно практически полезно и удобно.
ewps, это 'диализатор'. Подробнее о Erlang [Records] (http://www.erlang.org/doc/programming_examples/records.html). –
О, это должно быть 'clients = [] :: [pos_integer()],' –
Не можете ли вы отредактировать свой собственный пост, чтобы обновить его с помощью 2600 кредитных баллов? – ndim