Как уже отмечали другие, lists:filter/2
возвращает список, даже если это всего лишь один элемент.Функция, которую вы ищете: lists:keyfind/3
(в Erlang R14B03, для R13B04 и более ранних, используйте lists:keysearch/3
):
Eshell V5.8.4 (abort with ^G)
1> rd(user, {pid, name, nick}).
user
2> Users = [#user{pid = spawn(fun() -> ok end), name = name1, nick = nick1},
2> #user{pid = spawn(fun() -> ok end), name = name2, nick = nick2},
2> #user{pid = spawn(fun() -> ok end), name = name3, nick = nick3}].
[#user{pid = <0.34.0>,name = name1,nick = nick1},
#user{pid = <0.35.0>,name = name2,nick = nick2},
#user{pid = <0.36.0>,name = name3,nick = nick3}]
3> lists:keysearch(pid(0,35,0), #user.pid, Users).
{value,#user{pid = <0.35.0>,name = name2,nick = nick2}}
4> lists:keyfind(pid(0,35,0), #user.pid, Users).
#user{pid = <0.35.0>,name = name2,nick = nick2}
5> lists:keyfind(pid(0,99,0), #user.pid, Users).
false
lists:keyfind/3
предпочтительнее, потому что это проще.
Использование только #user.pid
возвращает положение поля pid
в записи #user
:
6> #user.pid.
2