Может быть, вы имеете в виду что-то вроде:
-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]
Дальнейшее чтение:
@ ПРОСТО МОЙ правильный ответ ответ заставил меня вспомнить, что мне нравится, как Haskell получает значения полей в типе данных.
Вот определение типа данных, украденного из Learn You 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 использует макросы, которые аналогичны тем, что предоставляет схема (например, Racket ), когда вы хотите создать новое значение некоторой структуры:
> (define-struct car (company model year))
> (define supra (make-car "Toyota" "Supra" 2005))
> (car-model supra)
"Supra"
Я надеюсь, что в будущем у нас будет что-то близкое к синтаксису записей на Haskell, что было бы действительно практически полезным и удобным.