Có lẽ bạn có nghĩa là một cái gì đó như:
-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()]
có nghĩa là loại lĩnh vực này là danh sách các giá trị nguyên dương, bắt đầu từ 1
; đó là gợi ý cho công cụ phân tích dialyzer
, khi nó thực hiện kiểm tra kiểu.
Erlang cũng cho phép bạn sử dụng phù hợp với mô hình trên hồ sơ:
5> reclist:get_clients(reclist:some_state()).
[1,2,3]
Đọc thêm:
@JUST MY OPINION chính xác của answer làm tôi nhớ rằng tôi thích cách Haskell đi về nhận giá trị của các trường trong kiểu dữ liệu.
Dưới đây là một định nghĩa của một kiểu dữ liệu, bị đánh cắp từ Learn You a Haskell for Great Good!, mà thúc đẩy cú pháp kỷ lục:
data Car = Car {company :: String
,model :: String
,year :: Int
} deriving (Show)
Nó tạo ra các chức năng company
, model
và year
, mà lĩnh vực tra cứu trong các loại dữ liệu. Đầu tiên chúng ta tạo ra một chiếc xe mới:
ghci> Car "Toyota" "Supra" 2005
Car {company = "Toyota", model = "Supra", year = 2005}
Hoặc, sử dụng cú pháp kỷ lục (theo thứ tự của các lĩnh vực không quan trọng):
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
Chúng tôi thậm chí có thể sử dụng mô hình phù hợp:
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"
Tôi nhớ đã có những nỗ lực để thực hiện một cái gì đó tương tự như cú pháp hồ sơ của Haskell trong Erlang, nhưng không chắc chắn nếu họ đã thành công.
Một số bài viết, liên quan đến những nỗ lực:
Dường như LFE sử dụng macro, tương tự với những gì cung cấp Scheme (Racket, ví dụ), khi bạn muốn tạo ra một giá trị mới của một số cấu trúc:
> (define-struct car (company model year))
> (define supra (make-car "Toyota" "Supra" 2005))
> (car-model supra)
"Supra"
Tôi hy vọng chúng tôi sẽ có một cái gì đó gần với cú pháp ghi Haskell trong tương lai, điều đó sẽ thực sự hữu ích và tiện dụng.
ewps, đó là 'dialyzer'. Thông tin thêm về Erlang [Records] (http://www.erlang.org/doc/programming_examples/records.html). –
Ồ, nó phải là 'clients = [] :: [pos_integer()], ' –
Bạn không thể sửa bài của riêng bạn để cập nhật điều đó với 2600 điểm tín dụng của bạn? – ndim